알고리즘/구현 & 그리디 & 브루트포스

[백준]JAVA - 1052번: 물병

K.두부 2022. 10. 8. 12:38
반응형

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

 

1052번: 물병

지민이는 N개의 물병을 가지고 있다. 각 물병에는 물을 무한대로 부을 수 있다. 처음에 모든 물병에는 물이 1리터씩 들어있다. 지민이는 이 물병을 또 다른 장소로 옮기려고 한다. 지민이는 한 번

www.acmicpc.net

풀이

문제를 보자마자 '2'로 무언가를 해야한다는 걸 알았다.

하지만 쉽게 찾을 수가 없었고 이것저것 해보다가 2진수를 발견했다.

 

우선 숫자 N을 Integer.toBinaryString(N)을 이용해서 2진수로 변경해주면 된다. 

String binary = Integer.toBinaryString(N);

이 문제의 핵심은 2진수로 변경된 숫자 '1'의 개수를 보면 된다.

 

예제 2번에서 숫자 N(13)을 2진수로 변경했을 때 1101이 나온다.

여기서 '1'의 개수는 K(2)보다 많기 때문에 N+1을 해주면서 숫자 '1'의 개수가 K보다 같거나 작을 때까지 돌리면 된다.

 

1101 (13) → 3개

1110 (14) → 3개

1111 (15) → 4개

10000 (16) → 1개

 

'1'의 개수가 K인 2보다 작거나 같은 경우는 숫자 N에서 3을 더했을 경우로 정답은 3이 된다.

 

<최종코드>

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());
		
        int N = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());
        int ans = 0;
		
        while (true) {
            int cnt = 0;
            String binary = Integer.toBinaryString(N); // 2진수로 변경
            
            // '1'의 개수 count
            for (int i=0; i<binary.length(); i++) {
                if (binary.charAt(i) - '0' == 1) cnt++;
            }
			
            if (cnt <= K) {
                System.out.println(ans);
                break;
            } else {
                N++;
                ans++;
            }
        }
    }
}
반응형