문제 풀이/백준

[백준] 1322번. X와 K(JAVA)

27200 2025. 4. 4. 09:59

문제

https://www.acmicpc.net/problem/1322


풀이(22분)

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        long x = Long.parseLong(st.nextToken());
        long k = Long.parseLong(st.nextToken());

        List<Long> availableBits = new ArrayList<>();
        long curNum = 1;

        while ((1L << availableBits.size()) <= k) {
            if ((x | curNum) != x) {
                availableBits.add(curNum);
            }
            curNum <<= 1;
        }

        long result = 0;
        for (int i = availableBits.size() - 1; i >= 0; i--) {
            if (k == 0) break;
            long power = 1L << i;
            if (k >= power) {
                result += availableBits.get(i);
                k -= power;
            }
        }

        System.out.println(result);
    }
}

문제 풀이 전략

 

풀이 자체만 이해하면 비트 연산을 이용한 코드 구현이 어려웠던 문제이다.

풀이는 간단하다.

OR연산을 한 값이 덧셈을 한 값과 동일하려면 X의 0의 자리에 0 또는 1만 채워넣는 것이 가능하다.

 

문제 예시인 5를 보자.

그렇다면 5 = 101이다.

첫번째 Y는 그렇기에 10인 2가 되는 것이다.

이런 식으로 X의 0의 자리를 채워가며 경우의 수를 따지다가 원하는 인덱스를 찾으면 거기서부터 맞춰주면 되는 것이다.