-- 예전 기록/BOJ

[ BOJ ] 12833 : XORXORXOR ( BRONZE 1 ) / C, Python

rejo 2023. 11. 16. 10:50

문제

세 수 A, B, C를 입력 받은 다음, ( ( ( ( A XOR B ) XOR B ) XOR B ) … ) XOR B 형태로 연산을 C회 했을 때의 결과값을 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 A, B, C가 주어진다. (0 < A, B, C ≤ 10^9)

출력

첫째 줄에 계산된 결과를 출력한다.

풀이 과정

똑같은 수 두 개를 XOR 연산 하면 0을 얻을 수 있다는 점 아시나요? 

그리고, 어떠한 수와 0을 XOR 연산 하면 수가 바뀌지 않는다는 점도 아시나요?

XOR 은 비트가 다를 때 1이기 때문에, 같은 수끼리 XOR 을 하면 모두 0이 나오고, 

N과 전체가 0인 수와 XOR 을 하면 결국 비트 중에 1이 포함된 수는 N밖에 없기 때문에, N이 그대로 나오게 됩니다.

 

문제는 A에 B를 XOR 하는 것을 최대 10^9번 진행해야 하는데, 위의 특성을 이용하면 해당 연산을 줄일 수 있습니다.

 

( ( A XOR B ) XOR B ) -> ( A XOR ( B XOR B ) ) -> ( A XOR 0 ) -> A

( ( ( A XOR B ) XOR B ) XOR B ) -> ( ( A XOR B ) XOR ( B XOR B ) ) -> ( ( A XOR B ) XOR 0 ) -> A XOR B

 

XOR 하는 B의 개수가 짝수이면 이 B들을 0으로 만들어버릴 수 있고, XOR 하는 B의 개수가 홀수이면 1개를 제외한 나머지 B들을 0으로 만들어버려 XOR B 하나만 남습니다.

 

즉, C가 홀수면 A XOR B 를 출력하고, C가 짝수면 A를 출력합니다.

 

C

#include <stdio.h>

int main(void) {
    int a, b, c;
    scanf("%d %d %d", &a, &b, &c);
    if (c % 2 == 0) printf("%d", a);
    else printf("%d", a ^ b);
    return 0;
}

Python

a, b, c = map(int, input().rstrip().split())
print(a ^ (0 if c % 2 == 0 else b))