백준 물병

처음에 그림을 그려보고 2의 제곱수가 무조건 1개로 합쳐진다는걸 생각했고 K가 1보다 클때는 2로 나눠지지 않을때마다 카운트 하면서 카운트 값이 K보다 크다면 N에 +1을 하면서 카운트값이 K보다 작아질때까지 반복했습니다.

public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        int add = 0;
        int n = Integer.parseInt(st.nextToken());
        int k = Integer.parseInt(st.nextToken());

        while (true) {
            int bottle = n + add;
            int c = 0;
            while (bottle > 0) {
                if (bottle % 2 != 0) {
                    c++;
                }
                bottle /= 2;
            }
            if (c <= k) {
                break;
            }
            add++;
        }
        System.out.println(add);

    }

다른분들의 코드를 찾아봤을때 이진법으로 사용한 코드가 인상깊었습니다.

참고

K개의 물병을 만든다는 것은 곧 물병의 총 개수를 이진수로 변환했을 때의 1의 개수와 동일하다는 것도 알 수 있습니다.
따라서, N보다 큰 수 중, 이진수로 변환했을 때의 1의 개수가 K 이하인 수를 찾아 출력하면 됩니다.

좋은 웹페이지 즐겨찾기