Study/Baekjoon

Baekjoon3009: 네 번째 점

devyoseph 2021. 10. 14. 05:20

문제

세 점이 주어졌을 때, 축에 평행한 직사각형을 만들기 위해서 필요한 네 번째 점을 찾는 프로그램을 작성하시오.

입력

세 점의 좌표가 한 줄에 하나씩 주어진다. 좌표는 1보다 크거나 같고, 1000보다 작거나 같은 정수이다.

출력

직사각형의 네 번째 점의 좌표를 출력한다.

 

추상화
일반 사각형의 나머지 한 점을 구하는 것은 여러가지 답이 나올 수 있을 것이다
하지만 문제의 제한조건은 너무 명확했다.
1) 직사각형일 것
2) 축에 평행하다
이 두개의 조건으로 인해 다음 조건이 성립한다
3) 각 x, y좌표는 각각 두번씩 사용된다

직사각형은 왼쪽x, 오른쪽x, 아래y, 위y 총 4개 종류의 좌표로 구성되며 각각 2번씩 사용된다
입력값은 이중에서 6개를 알려준다. 사용되지 않은 좌표값을 입력하기만 하면된다

 

확장성
if문을 통해 크기가 3인 배열을 만들고 경우의 수를 나누어 각각을 비교할 수 있다
    → 1과 2가 같은 경우, 2와 3이 같은 경우, 1과 3이 같은 경우

하지만 위 방식은 이 문제에만 한정된다. 확장성을 위한 배열 논리문으로 풀어보았다
1) 크기가 3인 배열을 만든다: 하나는 논리, 다른 하나는 숫자이다. x, y에 대하여 각각 만든다
2) 값을 집어넣고 반복문을 통해 현재 index가 아닌 다른 index의 값과 겹치게 되면 둘 모두의 index를 논리배열에 표기
3) 표기되지 않은 값을 찾아 출력한다
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException{
	 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	 StringTokenizer st;
	 int[] x = new int[3];
	 int[] y = new int[3];
	 boolean[] overlapX = new boolean[3];
	 boolean[] overlapY = new boolean[3];
	 int X=0,Y=0; //출력할 값
	 for(int i =0; i<3; i++) {
		 st = new StringTokenizer(br.readLine(), " ");
		 x[i] = Integer.parseInt(st.nextToken());
		 y[i] = Integer.parseInt(st.nextToken());
	 }
	 for(int i =0; i<3;i++) {
		 for(int j =0; j<3; j++) {
			 if(i != j) {
// 자기와 다른 index의 값과 같을 때, 해당 값들을 중복으로 표시해준다
			 if(x[i]==x[j]) {
				 overlapX[i] = true;
				 overlapX[j] = true;
			 }
			 if(y[i]==y[j]) {
				 overlapY[i] = true;
				 overlapY[j] = true;
			 }
		 }
		 }
	 }
	 for(int i =0; i<3; i++) {
		 if(overlapX[i] == false) {
			 X = x[i];
		 }
		 if(overlapY[i] == false) {
			 Y = y[i];
		 }	 
//중복이 아닌 변수를 골라서 입력한다
	 }
	System.out.print(X+" "+Y); 
}
}