두 자연수 X와 K가 주어진다. 그러면, 다음 식을 만족하는 K번째로 작은 자연수 Y를 구하는 문제이다.

X + Y = X | Y

 

| 가 OR 비트연산이므로 2진수로 생각해보자.

 

예제 X = 5 = 101(2)

101 + Y = 101 | Y 의 경우 X의 0이 있는 부분이 1인 경우 Y가 된다. 가능한 Y값을 크기순으로 나열하면 아래와 같다.

문제 풀이 방법은 위와 같이 X가 1, 0인 부분을 저장해 두고 1인 부분은 건너뛰면서 다음으로 가능한 수를 찾아준다.

y 값은 1을 넘어갈 수 있다고 했으니 long 범위로 설정해준다면 8byte = 64bit일 것이고, 이를 배열에 담아준다.

 

x, k를 2진수로 바꿔서 배열에 거꾸로 저장한 후 0인 비트를 해당 자리 수 만큼 쉬프트한다.

이를 구현한 코드는 아래와 같다.

import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		long x = in.nextLong();
		long k = in.nextLong();

		int binX[] = new int[65];
		int binK[] = new int[65];

		int i = 0;

		while (x != 0 || k != 0) {
			binX[i] = (int) (x % 2);
			binK[i] = (int) (k % 2);
			x /= 2;
			k /= 2;
			i++;
		}

		int xIndex = 0, kIndex = 0;
		long y = 0;

		while (kIndex < i) {
			if (binX[xIndex] == 0) {
				y |= (1L << xIndex) * binK[kIndex++];
			}
			xIndex++;
		}

		System.out.println(y);
	}
}

 

'알고리즘 공부 > boj' 카테고리의 다른 글

boj 1027: 고층 건물  (0) 2021.02.02
boj 17071: 숨바꼭질 5  (0) 2021.01.31
boj 1294: 문자열 장식  (0) 2021.01.29
boj 16637: 괄호 추가하기  (0) 2021.01.27
boj 1167: 트리의 지름  (0) 2021.01.25

+ Recent posts