[BaekJoon] 1485번 - 정사각형 [Java][C++]
[BaekJoon] 1485번 - 정사각형 [Java][C++]
1. 문제 풀이
네 점이 정사각형을 만들 수 있는지 없는지 판단하는 문제로 정사각형은 네 변의 길이가 같고, 두 대각선의 길이도 같으면 정사각형이 된다. 주어진 네 점을 $x$ 좌표에 대한 오름차순으로, $x$ 좌표가 같으면 $y$ 좌표에 대한 오름차순으로 정렬하면 가장 작은 점과 가장 큰 점이 대각 관계에 있어서 이점을 활용해 네 변의 길이와 두 대각선의 길이를 구해서 정사각형을 만족하는지 비교해줬다.
2. 코드
1. 풀이 [Java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st;
int T = Integer.parseInt(br.readLine());
for (int tc = 1; tc <= T; tc++) {
long[][] pos = new long[4][2];
for (int i = 0; i < 4; i++) {
st = new StringTokenizer(br.readLine());
pos[i][0] = Long.parseLong(st.nextToken());
pos[i][1] = Long.parseLong(st.nextToken());
}
Arrays.sort(pos, (o1, o2) -> {
if (o1[0] != o2[0]) return Long.compare(o1[0], o2[0]);
return Long.compare(o1[1], o2[1]);
});
long side1 = (pos[0][0] - pos[1][0]) * (pos[0][0] - pos[1][0]) + (pos[0][1] - pos[1][1]) * (pos[0][1] - pos[1][1]);
long side2 = (pos[0][0] - pos[2][0]) * (pos[0][0] - pos[2][0]) + (pos[0][1] - pos[2][1]) * (pos[0][1] - pos[2][1]);
long side3 = (pos[3][0] - pos[1][0]) * (pos[3][0] - pos[1][0]) + (pos[3][1] - pos[1][1]) * (pos[3][1] - pos[1][1]);
long side4 = (pos[3][0] - pos[2][0]) * (pos[3][0] - pos[2][0]) + (pos[3][1] - pos[2][1]) * (pos[3][1] - pos[2][1]);
long diagonal1 = (pos[3][0] - pos[0][0]) * (pos[3][0] - pos[0][0]) + (pos[3][1] - pos[0][1]) * (pos[3][1] - pos[0][1]);
long diagonal2 = (pos[2][0] - pos[1][0]) * (pos[2][0] - pos[1][0]) + (pos[2][1] - pos[1][1]) * (pos[2][1] - pos[1][1]);
if (side1 == side2 && side1 == side3 && side1 == side4 && diagonal1 == diagonal2) {
sb.append(1).append("\n");
} else {
sb.append(0).append("\n");
}
}
System.out.print(sb);
}
}
2. 풀이 [C++]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
for (int tc = 1; tc <= t; tc++) {
vector<pair<long long, long long>> v(4);
for (auto& p : v) cin >> p.first >> p.second;
sort(v.begin(), v.end());
long long side1 = (v[0].first - v[1].first) * (v[0].first - v[1].first) +
(v[0].second - v[1].second) * (v[0].second - v[1].second);
long long side2 = (v[0].first - v[2].first) * (v[0].first - v[2].first) +
(v[0].second - v[2].second) * (v[0].second - v[2].second);
long long side3 = (v[3].first - v[1].first) * (v[3].first - v[1].first) +
(v[3].second - v[1].second) * (v[3].second - v[1].second);
long long side4 = (v[3].first - v[2].first) * (v[3].first - v[2].first) +
(v[3].second - v[2].second) * (v[3].second - v[2].second);
long long diagonal1 = (v[3].first - v[0].first) * (v[3].first - v[0].first) +
(v[3].second - v[0].second) * (v[3].second - v[0].second);
long long diagonal2 = (v[2].first - v[1].first) * (v[2].first - v[1].first) +
(v[2].second - v[1].second) * (v[2].second - v[1].second);
cout << (side1 == side2 && side1 == side3 && side1 == side4 && diagonal1 == diagonal2) << '\n';
}
}
This post is licensed under CC BY 4.0 by the author.