Post

[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.