-- 예전 기록/BOJ

[ BOJ ] 27960 : 사격 내기 ( BRONZE 3 ) / C, Python

rejo 2023. 11. 7. 10:50

문제

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)