프로그래밍/Algorithm

사각형 중 3 꼭지점의 좌표가 입력되었을 때, 나머지 좌표를 알아내라.

모지사바하 2015. 8. 19. 10:15


문제

AdbyMe, Inc. 의 인턴인 A.I.는 웹 브라우저에 직사각형을 그리는 코드를 작성해야 한다. 웹 브라우저는 직사각형 모양의 뷰포트를 가지고 있고, 그려지는 직사각형의 네 변은 반드시 그 뷰포트의 두 축에 평행해야 한다.

한편, A.I.는 코드를 작성하던 중 그릴 직사각형의 네 꼭지점 중 어느 것이든 세 개의 좌표를 알고 있다면 나머지 점의 위치는 유일하게 결정됨을 알아내었다 (네 점 중 어떤 두 개의 좌표를 알아낸 경우는 때에 따라 직사각형을 결정하지 못할 수도 있다.)

A.I.는 LIBe에게 이를 이번 대회 문제로 출제할 것을 제안하였다.

직사각형을 이루는 네 점 중 임의의 세 점의 좌표가 주어졌을 때, 나머지 한 개의 점의 좌표를 찾는 프로그램을 작성하라.

입력

입력은 T 개의 테스트 케이스로 구성된다. 입력의 첫 행에는 T 가 주어진다.

각 테스트 케이스는 공백 하나로 구분되는 두 개씩의 정수로 구성된 세 행으로 이뤄지며, 각각 임의의 세 점의 x와 y 좌표이다. 브라우저 뷰포트의 맨 왼쪽 위 픽셀의 좌표는 (1, 1)이고, 맨 오른쪽 아래 픽셀의 좌표는 (1000, 1000)이다. 모든 좌표는 뷰포트 안에 위치하며, 각 점의 위치는 모두 다르다.

출력

각 테스트 케이스에 대해 한 행에 하나씩 좌표가 주어지지 않은 나머지 한 점의 x와 y 좌표를 공백 하나로 구분하여 출력한다.

예제 입력

2
5 5
5 7
7 5
30 20
10 10
10 20

예제 출력

7 7
30 10



import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
static int[] pointXArray = new int[1000];
static int[] pointYArray = new int[1000];

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int cases = Integer.parseInt(sc.nextLine()) * 3;

int count = 1;
List<String> pointList = new ArrayList<>();
while (cases-- > 0) {
validAndCheck(sc.nextLine());

if (count % 3 == 0) {
pointList.add(findLastPoint());
}
count++;
}

pointList.forEach(System.out::println);

}

private static String findLastPoint() {
StringBuilder lastPoint = new StringBuilder();
for (int i = 0; i < pointXArray.length; i++) {
if (pointXArray[i] > 0 && pointXArray[i] % 2 == 1) {
lastPoint.append(i + " ");
}
}

for (int i = 0; i < pointYArray.length; i++) {
if (pointYArray[i] > 0 && pointYArray[i] % 2 == 1) {
lastPoint.append(i);
}
}

pointXArray = new int[1000];
pointYArray = new int[1000];

return lastPoint.toString();
}

private static void validAndCheck(String input) {
String[] split = input.split(" ");
if (split.length == 2) {
for (int i = 0; i < split.length; i++) {
int point = Integer.parseInt(split[i]);
if (point < 1 || point > 1000) {
throw new IllegalStateException();
}

if (i == 0) {
pointXArray[point]++;
} else {
pointYArray[point]++;
}
}


} else {
throw new IllegalStateException();
}

}


}

회고.

algospot.com 에서 tutorial의 왕초보급 문제 라길래, 우습게 알고 시작했는데

생각했던것보다 많~~이 어려웠다.


어려웠던 점은 입력 첫줄에 테스트케이스의 수를 입력하고, 

테스트 케이스의 수만큼 결과를 구해야하는 부분이 어려웠다.

첫번째 케이스의 좌표와 두번째 케이스의 좌표가 섞일수 있으므로 좌표 입력이 3번 이뤄졌을 때, 나머지 좌표를 구해서 어딘가 담고 있다가

입력이 모두 마치면 출력해줘야하는 점이 좀 까다로웠고, 나머지 좌표를 구하는 방법은 생각보다 금방 알았는데, 


프로그램으로 어떤 방법으로 구현해야할지 한참 고민했다.


결국, 1000 사이즈의 x int배열, 1000 사이즈의 y int배열을 만들어서 

좌표가 입력되면 배열의 좌표번째의 수를 1씩 더해주어 그 수가 홀수인 경우가 각 축의 나머지 좌표가 되는 방식으로 구현하였다.


내가 뭔가 생각을 어렵게 한건지, 내가 머리가 나쁜건지 잘모르겠다.. 왜 이렇게 소스도 장황하고 문제가 어렵게 느껴졌을까??


그런데 이상하게 www.algospot.com 에 답안을 제출하면 런타임오류가 뜬다. 왜그럴까 ㅡ.ㅡ;