본문 바로가기

백준

3009 네 번째 점

#include <iostream>

using namespace std;

int main() {
    int x1, x2, x3;
    int y1, y2, y3;
    scanf("%d %d %d %d %d %d", &x1, &y1, &x2, &y2, &x3, &y3);
    
    
    if(x1 == x2)
        printf("%d ", x3);
    else if(x3 == x2)
        printf("%d ", x1);
    else
        printf("%d ", x2);
        
    if(y1 == y2)
        printf("%d", y3);
    else if(y3 == y2)
        printf("%d", y1);
    else
        printf("%d", y2);    
}

조건문으로 다른 거 하나 찾았다!

 


#include <iostream>

int main() {
    int x1, x2, x3;
    int y1, y2, y3;
    scanf("%d %d %d %d %d %d", &x1, &y1, &x2, &y2, &x3, &y3);
    printf("%d %d", x1 ^ x2 ^ x3, y1 ^ y2 ^ y3);
    
    return 0;
}

이것도 더 간단한 방법이 있다! XOR을 이용하는 방법이다. 

a ^ a = 0 같은 걸 XOR 연산하면 0이고, 0 ^ b = b 0과 어떤 수를 XOR 연산하면 b가 그대로 나온다!

그래서 a ^ a ^ b = b 다른 하나가 나온다.

 

이것도 처음에 바로 이해가 안 가서 진리표를 그려봤다. 이런 원리로 다른 하나를 구할 수 있다. 

 

이 공식을 봤을 때 바로 생각난 건 개발자 개그였다. 전에 우연히 개발자 개그랍시고 개발자는 의자가 두 개 밖에 없어서 자리를 바꾸지 못한다는 글을 봤는데, 거기에 사람을 XOR 3번하면 된다는 댓글이 있었다. 원리는 모르겠고 그냥 웃었는데 이제는 바꿀 수 있을 것 같다. 

 

#include <iostream>

int main() {
    int h1 = 3, h2 = 4;
    
    printf("%d %d", h1^h1^h2, h2^h2^h1);
    
    return 0;
}

물론 사람은 정수형이 아니지만 처음 생각한 건 이거였다. 그런데 이건 그냥 printf(h2 h1) 과 다를게 없지 않나는 생각이 들었다. 

 

그래서 이런 식으로 코드를 짜봤다. 이러면 진정한 의자 바꿈이 된다. 

#include <iostream>

int main() {
    int h1 = 3, h2 = 4;
    
    h1 = h1 ^ h2;
    h2 = h1 ^ h2;
    h1 = h1 ^ h2;
    
    printf("%d %d", h1, h2);
    
    return 0;
}

 

바꿨다! 아 너무 재밌다.

'백준' 카테고리의 다른 글

시간복잡도와 공간복잡도  (0) 2019.10.06
14568 2017 연세대학교 프로그래밍 경시대회  (0) 2019.10.05
2566 최댓값  (0) 2019.10.04
2501 약수 구하기  (0) 2019.10.04
2965 캥거루 세마리  (0) 2019.10.04