https://www.acmicpc.net/problem/3009
오랜만에 블로그에 글을 쓴다.
한동안 알고리즘 문제를 공부하지 않다가 다시 시작하여 쉬운것부터 하고있는데 인상깊은 문제라 적어본다.
문제는 간단하다. 직사각형의 세점을 주어주고 나머지 한점을 출력하는 것이다.
어떻게 하면 간단하게 풀 수 있을까? 고민하다가 입력값을 보니
x의 좌표는 x1, x2 이렇게 2가지이고, y도 y1,y2 이 2가지란 사실이 눈에 들어왔다.
그렇다면 이 중 한번만 입력된 x와 y가 나머지 한 점의 좌표라는 것을 알게되었고 이게 가장 간단하겠다고 생각했다.
그런데 막상 깔끔한 구현방법이 떠오르지 않는다. if문으로도 애매해서 결국 gpt에게 물어보니
XOR 연산으로 깔끔하게 구현해낸다. 물론 삼항연산자로도 하는데 XOR이 가독성측면에서도 훨씬 깔끔하다.
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int x, y, ax, ay;
x = y = 0;
for (int i = 0; i < 3; i++) {
cin >> ax >> ay;
x ^= ax;
y ^= ay;
}
cout << x << ' ' << y << '\n';
return 0;
}
다음이 gpt 코드인데, x,y 변수에 입력값을 xor 연산하면 한번만 입력된 값이 남게된다.
왜냐하면 다음 3가지 사실을 따르기 때문이다.
a ^ b 에서
1. a와 b 가 같으면 0, 다르면 1이다.
2. a^0 은 a 이다.
3. (a^b)^c == a^(b^c) 이다. 즉 순서가 상관없다.
따라서 비트연산으로 간단하게 해결할 수 있다.
그동안 이론으로만 이해했지만 써본적이 없었는데 이렇게 직접 해결에 써보니 인상깊어서 기억해두려 남겨둔다.