문제
세 수 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))
'-- 예전 기록 > BOJ' 카테고리의 다른 글
[ BOJ ] 10825 : 국영수 ( SILVER 4 ) / Python (0) | 2023.11.17 |
---|---|
[ BOJ ] 1094 : 막대기 ( SILVER 5 ) / C, Python (0) | 2023.11.16 |
[ BOJ ] 2204 : 도비의 난독증 테스트 ( BRONZE 1 ) / C, Python (0) | 2023.11.14 |
[ BOJ ] 10769 : 행복한지 슬픈지 ( BRONZE 1 ) / C, Python (0) | 2023.11.14 |
[ BOJ ] 2309 : 일곱 난쟁이 ( BRONZE 1 ) / C, Python (0) | 2023.11.14 |