※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 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

+ Recent posts