java로 백준 제출할 때 패키지를 따로 넣지 않고 calss명을 Main 으로 작성할 것!
Scanner를 사용하려고 했지만 백준에서 시간 초과 가능성이 있다고 하여 buffer reader와 buffer writer를 사용해줌.
scanner와 차이점은 입출력 숫자 버퍼에 저장 여부.
사용법은 비슷해서 다르게 느껴지진 않았다.
입력받은 네 점이 정사각형이 될 수 있는지의 여부를 확인해야하는 문제.
일단 네 점을 입력받기 위해 4행 2열 짜리arr 이차원 배열을 선언해 4점의 x y좌표를 저장해 주었다.
또한 length 배열을 선언하여 점 사이의 거리를 측정해 저장해주었다.
네 점을 입력받아 구할 수 있는 거리의 수는 6가지이므로 length의 길이도 6으로 해주었다.
점사이 거리를 구하기 위해서 두 점사이의 거리의 제곱 (점과 점 사이 공식에서 루트 적용 전)을 구하는 함수도 따로 작성해줌.
저장된 length 배열을 정렬한 다음 정사각형의 조건을 판단해주었다.
0~3 인덱스는 네 변의 길이가 저장되어있고 4,5 인덱스는 대각선의 길이가 저장되어있다.
따라서 0~3 인덱스에 저장된 값이 같고, 길이가 0 이상이고, 대각선의 제곱의 길이는 한 변의 제곱 길이 *2와 같을 경우 (피타고라스의 공식) 정사각형으로 판단해주었다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(input.readLine());
for (int i = 0; i < n; i++) {
int[][] arr = new int[4][2];
for (int row = 0; row < 4; row++) {
String[] xy = input.readLine().split(" ");
arr[row][0] = Integer.parseInt(xy[0]);
arr[row][1] = Integer.parseInt(xy[1]);
}
int[] lengths = new int[6];
int index = 0;
for (int j = 0; j < 4; j++) {
for (int k = j + 1; k < 4; k++) {
lengths[index++] = distanceSquared(arr[j], arr[k]);
}
}
java.util.Arrays.sort(lengths);
if (lengths[0] == lengths[1] && lengths[1] == lengths[2] && lengths[2] == lengths[3] &&
lengths[4] == lengths[5] && lengths[0] > 0 && lengths[4] == 2 * lengths[0]) {
bw.write("1\n");
} else {
bw.write("0\n");
}
}
bw.flush();
bw.close();
}
private static int distanceSquared(int[] p1, int[] p2) {
return (p1[0] - p2[0]) * (p1[0] - p2[0]) + (p1[1] - p2[1]) * (p1[1] - p2[1]);
}
}