PS/C++

실력이 좀 늘었다는걸 체감한 순간(백준 3009번)

siyamaki 2024. 6. 20. 09:58

https://www.acmicpc.net/problem/3009


네 번째 점이라는 브론즈 문제인데 직사각형을 이루는 3개의 점이 주어졌을 때 나머지 하나의 점을 찾는 문제다

 

본래라면 아래 코드처럼 좌표값을 각각 비교 해 나머지 점 하나를 찾는 생각을 했지만

#include <bits/stdc++.h>
#define FASTIO ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr)

using namespace std;

int main() {
    FASTIO;
    int x1, y1, x2, y2, x3, y3;
    cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;
    int x4, y4;
    if(x1 == x2) x4 = x3;
    else if(x2 == x3) x4 = x1;
    else x4 = x2;

    if(y1 == y2) y4 = y3;
    else if(y2 == y3) y4 = y1;
    else y4 = y2;

    cout << x4 << ' ' << y4;
}

 

한달 전 쯤 비트마스킹을 좀 공부했더니 갑자기 아래와 같은 아이디어가 떠오름

 

#include <bits/stdc++.h>
#define FASTIO ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr)

using namespace std;

int main() {
    FASTIO;
    int x1, y1, x2, y2, x3, y3;
    cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;
    cout << (x1 ^ x2 ^ x3) << ' ' << (y1 ^ y2 ^ y3);
}

 

xor연산은 두 수가 같으면 0이 되는 성질을 이용했다

 

세 값을 xor 하면 결국 값이 같은 두 값은 0이 되고 0 ^ k = k이니 남은 값이 정답이 된다

 

갑자기 이런 아이디어가 떠올라서 신기했음