※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 1322번 문제인 X와 K이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/1322
1322번: X와 K
첫째 줄에 X와 K가 주어진다. X와 K는 2,000,000,000보다 작거나 같은 자연수이다.
www.acmicpc.net
두 이진수 X, Y를 xor한 결과가 두 수의 합과 같다는 것은 X와 Y의 각 자리가 모두 1인 자리가 존재하지 않다는 것과 동치임을 관찰하자. 즉, 문제의 조건을 만족시키는 Y는 X를 이진수로 표현했을 때 0인 자리에는 0 또는 1이, 1인 자리에는 0이 들어있어야 한다는 점을 관찰하자.
위 관찰을 이용하면 X를 이진수로 표현했을 때 1인 자리들에는 0을, 0인 자리들만을 이어붙일 때 그 값이 K가 되게끔 하는 수가 문제의 답이 됨을 알 수 있다. 이를 구하는 프로그램을 작성해 문제를 해결하자.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
typedef unsigned long long ll;
ll X, K;
bool used[64];
int d, dd;
ll val = 1, ans;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> X >> K;
while (X) {
if (X & 1) used[d] = 1;
d++, X >>= 1;
}
while (K) {
while (used[dd]) dd++, val <<= 1;
used[dd] = 1;
if (K & 1) ans += val;
K >>= 1;
}
cout << ans;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 16169 // C++] 수행 시간 (0) | 2023.08.02 |
---|---|
[BOJ 23059 // C++] 리그 오브 레게노 (0) | 2023.08.01 |
[BOJ 1334 // C++] 다음 팰린드롬 수 (0) | 2023.07.30 |
[BOJ 1323 // C++] 숫자 연결하기 (0) | 2023.07.29 |
[BOJ 26937 // C++] Köpa Böcker (0) | 2023.07.28 |