Algorithm 🧑🏻‍💻/백준(BOJ)

[백준,c++] 1052번 - 물병

dkswnkk 2022. 3. 30. 15:31

문제

 

1052번: 물병

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

www.acmicpc.net

 

코드

#include <iostream>
using namespace std;

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    int N,K; cin>>N>>K;
    
    int ans = 0;
    
    for(ans;; ans++){
        int cnt = 0;
        int temp_N = N;
        while(temp_N!=0){
            if(temp_N%2) cnt++;
            temp_N/=2;
        }
        if(cnt<=K) break;
        N++;
    }
    
    cout<<ans;
}

 

풀이

아래의 입출력으로 한번 설명해 보겠습니다.

13개의 물병을 합치게 되면 결국 최종적으로 3개의 물병이 남게 됩니다. 나누는 과정은 아래 이미지와 같고, 코드상으로는 while(temp_N!=0) 부분입니다.

현재 남은 물병 3개는 한 번에 가져갈 수 있는 물병 개수 K보다 크기 때문에 물병을 또 추가하여 남은 물병 수를 줄여야 합니다.

물병을 추가하는 과정은 N++입니다. 이제 다시 위 작업을 반복하여 "남은 물병 개수 <=K" 가 될 때까지 계산하여 최종적으로 N을 추가해준 횟수를 출력하면 정답이 됩니다.

문제에서 만약 정답이 없을 경우에는 -1을 출력하라고 했는데 정답이 없는 경우는 없으니 따로 처리해 주지 않아도 됩니다.