문제
A, B, C는 올해에도 예비군 훈련을 받으러 간다. 이번 예비군 훈련 과정 중에는 영점 사격이 있으며, 10개의 과녁 각각에 점수를 매겨 맞춘 과녁 점수의 총합을 측정한다. 과녁을 맞혔을 때, 과녁별로 각각 1점 / 2점 / 4점 / 8점 / 16점 / 32점 / 64점 / 128점 / 256점 / 512점을 얻는다. 과녁을 맞히지 않으면 해당 점수를 얻을 수 없으며, 각 과녁은 사람별로 최대 한 번만 맞힐 수 있다.
A, B와 C는 영점 사격 점수를 가지고 훈련 이후에 먹을 저녁 내기를 했다. A와 B는 각자 자신들의 총합 사격 점수를 공유했지만, C는 저녁 내기의 상황을 더 쫄깃하게 하고 싶었던지 점수를 공유하지 않고 아래와 같은 말을 했다.
"난 너희 둘 중 한 명만 맞힌 표적은 다 맞혔는데, 너희 둘 다 못 맞히거나 둘 다 맞힌 것은 전부 안 맞혔어."
A와 B는 이 말만으로는 도저히 C의 총합 점수를 알 수가 없어서 몰래 여러분에게 도움을 요청했다. C의 점수를 구해 A와 B를 도와주자!
입력
첫 번째 줄에 A와 B의 영점 사격 총합 점수인 정수 (0 ≤ S_A, S_B ≤ 1023)가 주어진다. A와 B의 점수를 과녁의 점수 합으로 나타낼 수 없는 경우는 주어지지 않는다.
출력
C의 점수를 출력한다.
풀이 과정
1점 / 2점 / 4점 / 8점 / 16점 / 32점 / 64점 / 128점 / 256점 / 512점 과녁은 2진수 비트 개념으로 바라보면 편하다.
1점과 2점 과녁을 맞췄다면 0000000011. 4점과 8점 과녁을 맞췄다면 000000110016점과 128점 과녁을 맞췄다면 0010010000
둘 중 한 명만 맞힌 표적은 다 맞혔다면, 두 사람의 맞힌 여부가 다를 때를 말하는 것이다.즉, 두 사람의 과녁이 동시에 0 0 이거나 1 1 인 경우에는 맞추지 않고, 0 1 이거나 1 0 인 경우엔 맞춘 것이다.
XOR 연산을 이용해 둘 중 한 명만 맞힌 표적만 1 표시가 되고 둘 다 맞추거나 맞추지 못한 표적은 0 표시를 하도록 계산할 수 있다.
따라서, Bitwise XOR 연산을 이용하여 계산한다.
C
#include <stdio.h>
int main(void) {
int x, y;
scanf("%d %d", &x, &y);
printf("%d", x^y);
return 0;
}
Python
x, y = map(int, input().split())
print(x^y)
'-- 예전 기록 > BOJ' 카테고리의 다른 글
[ BOJ ] 1110 : 더하기 사이클 ( BRONZE 1 ) / C, Python (0) | 2023.11.07 |
---|---|
[ BOJ ] 15904 : UCPC는 무엇의 약자일까? ( SILVER 5 ) / C, Python (0) | 2023.11.07 |
[ BOJ ] 25206 : 너의 평점은 ( SILVER 5 ) / C, Python (0) | 2023.11.07 |
[ BOJ ] 10995 : 별 찍기 - 20 ( BRONZE 3 ) / C, Python (0) | 2023.11.07 |
[ BOJ ] 11966 : 2의 제곱인가? ( BRONZE 3 ) / C, Python (0) | 2023.11.07 |