알고리즘/백준

백준 - 네 번째 점(3009) - C++

게임만드는학생 2026. 2. 21. 18:15

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) 이다. 즉 순서가 상관없다. 

 

따라서 비트연산으로 간단하게 해결할 수 있다.

그동안 이론으로만 이해했지만 써본적이 없었는데 이렇게 직접 해결에 써보니 인상깊어서 기억해두려 남겨둔다.