[백준] 3009번 네 번째 점

뱅뱅의 텃밭·2022년 7월 3일
0

백준

목록 보기
12/14

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

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

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

제출:

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int[] x = new int [4];
		int[] y = new int [4];
		for (int i=0; i<3; i++) {
			x[i] = sc.nextInt();
			y[i] = sc.nextInt();
		}
		
		if (x[0] != x[1]) {
			if (x[1] == x[2]) {
				x[3] = x[0];
			} else {
				x[3] = x[1];
			}
		} else {
			x[3] = x[2];
		}
		
		if (y[0] != y[1]) {
			if (y[1] == y[2]) {
				y[3] = y[0];
			} else {
				y[3] = y[1];
			}
		} else {
			y[3] = y[2];
		}
		System.out.println(x[3] + " " + y[3]);
		sc.close();
	}
}

정답은 맞았는데 억지로 어떻게든 구현해낸 모습이 안쓰럽기도 하고 코딩 처음 배웠을 때 같은 느낌이다.
일단 내가 풀어본 방법은 3개의 점을 입력받았을 때 x, y 각각 한번만 입력된 좌표값이 있으면 그게 네 번째 좌표의 x, y값이 된다는 것을 이용해서 문제를 풀었다.
그래서 if-else 문으로만 문제를 해결할 수는 있었다.
그러나 맞았다고 그냥 넘어가면 실력이 향상될 리가 없기 때문에 다른 사람들의 풀이를 찾아보았다.

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int x = 0, y = 0;
		for (int i = 0; i < 3; i++) {
			x = x ^ sc.nextInt();
			y = y ^ sc.nextInt();
		}
		System.out.print(x + " " + y);
		sc.close();
	}
}

처음에는 왜 XOR을 썼을까 생각을 했고, 하나하나 적어본 뒤에 이해했을때는 감탄스러웠다.
비트 XOR 연산자를 사용하면 다음과 같은 특성을 볼 수 있다. a^b=c, c^b=a, c^a=b
또한 XOR 연산자를 가지고 d라는 숫자와 0을 연산하면 d가 나온다. d^0=d
이를 이용해서 예를 들어 5 5, 5 7, 7 5 세 개의 점을 입력받았을 때 처음 두 점의 x좌표만 연산했을 때 5^5=0 이 나오고 0을 세 번째 점과 연산을 하면 0^7=7 이라는 값이 나오는데 이것이 네 번째 점의 x좌표(7)가 된다.
y좌표도 계산을 해보면 5^7=2 라는 의미없어 보이는 2가 나오게 되는데 세 번째 점과 연산을 하면 2^5=7 이라는 값이 나오게 되고 이것이 네 번째 점의 y좌표(7)가 된다.

XOR을 단순히 비트연산에서의 0과 1의 논리 연산자로써만 생각했었는데, 위에서 봤던 특성을 이용해 암/복호화에서도 사용된다는 것을 알 수 있었다.

profile
나만의 텃밭을 가꾸어보자

0개의 댓글