문제:
세 점이 주어졌을 때, 축에 평행한 직사각형을 만들기 위해서 필요한 네 번째 점을 찾는 프로그램을 작성하시오.
입력:
세 점의 좌표가 한 줄에 하나씩 주어진다. 좌표는 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의 논리 연산자로써만 생각했었는데, 위에서 봤던 특성을 이용해 암/복호화에서도 사용된다는 것을 알 수 있었다.