728x90
반응형
  • 문제

지민이는 N개의 물병을 가지고 있다. 각 물병에는 물을 무한대로 부을 수 있다. 처음에 모든 물병에는 물이 1리터씩 들어있다. 지민이는 이 물병을 또 다른 장소로 옮기려고 한다. 지민이는 한 번에 K개의 물병을 옮길 수 있다. 하지만, 지민이는 물을 낭비하기는 싫고, 이동을 한 번보다 많이 하기는 싫다. 따라서, 지민이는 물병의 물을 적절히 재분배해서, K개를 넘지 않는 비어있지 않은 물병을 만들려고 한다.

물은 다음과 같이 재분배 한다.

먼저 같은 양의 물이 들어있는 물병 두 개를 고른다. 그 다음에 한 개의 물병에 다른 한 쪽에 있는 물을 모두 붓는다. 이 방법을 필요한 만큼 계속 한다.

이런 제약 때문에, N개로 K개를 넘지않는 비어있지 않은 물병을 만드는 것이 불가능할 수도 있다. 다행히도, 새로운 물병을 살 수 있다. 상점에서 사는 물병은 물이 1리터 들어있다.

예를 들어, N=3이고, K=1일 때를 보면, 물병 3개로 1개를 만드는 것이 불가능하다. 한 병을 또다른 병에 부으면, 2리터가 들어있는 물병 하나와, 1리터가 들어있는 물병 하나가 남는다. 만약 상점에서 한 개의 물병을 산다면, 2리터가 들어있는 물병 두 개를 만들 수 있고, 마지막으로 4리터가 들어있는 물병 한 개를 만들 수 있다.

  • 입력

첫째 줄에 N과 K가 주어진다. N은 107보다 작거나 같은 자연수이고, K는 1,000보다 작거나 같은 자연수이다.

  • 출력

첫째 줄에 상점에서 사야하는 물병의 최솟값을 출력한다. 만약 정답이 없을 경우에는 -1을 출력한다.

  • 예제 입력
3 1
13 2
1000000 5
  • 예제 출력
1
3
15808
  • 접근방식

물통을 사지 않고 최대로 물병을 합쳤을 경우

N=2, {1,1} > {2} > 1병
N=3, {1,1,1} > {2,1} > 2병
N=4, {1,1,1,1} > {2,2} > {4} > 1병
N=5, {1,1,1,1,1} > {2,2,1} > {4,1} > 2병
N=6, {1,1,1,1,1,1} > {2,2,2} > {4,2} > 2병
N=7, {1,1,1,1,1,1,1} > {2,2,2,1} > {4,2,1} > 3병

즉, 물병을 하나도 사지않고 N이 2의 n제곱승일 경우 물병을 1병으로 합칠수 있음, 새로운 물병을 살 수 있으니 물병을 계속 구매할경우 물병의 개수가 결국 2의 n제곱승이 된다. (정답이 없을경우가 없음)

n은 주어진 물병의 개수, cnt는 들고가는 물병, result은 상점에서 구매한 물병의 수
1. 주어진 물병을 최대한 합침 (n을 2로 나누기)
2. 나머지가 발생하면 합쳐지지 않은 물병 존재, cnt++
3. n이 0이 될때까지 1~2반복
4. cnt의 개수가 k 이하일 때 result 출력, 아니면 1~3번 반복

  • 코드
#include <iostream>
#include <algorithm>

using namespace std;

int n, k, cnt, result;

int main()
{
    cin >> n >> k;

    // n은 주어진 물병의 개수, cnt는 들고가는 물병, result은 상점에서 구매한 물병의 수
    // 1. 주어진 물병을 최대한 합침 (n을 2로 나누기)
    // 2. 나머지가 발생하면 합쳐지지 않은 물병 존재, cnt++
    // 3. n이 0이 될때까지 1~2반복
    // 4. cnt의 개수가 k 이하일 때 result 출력, 아니면 1~3번 반복
    for (result = 0; ; result++) // 
    {
        int temp = n + result; // 상점에서 산 물병 개수 + 주어진 물병의 개수
        cnt = 0;

        while (temp) // temp != 0
        {
            if (temp % 2 == 1)
            {
                cnt++;
            }
            temp /= 2;
        }

        if (cnt <= k)   break;
    }
    cout << result;
    return 0;
}
 

1052번: 물병

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

www.acmicpc.net

 

728x90
반응형

'C++ > BOJ' 카테고리의 다른 글

[C++]/백준 9934번 완전 이진 트리  (0) 2024.03.05
[C++]/백준 2529번 부등호  (0) 2024.03.05
[C++]/백준 1049번 기타줄  (0) 2024.03.02
[C++]/백준 1026번 보물  (0) 2024.03.02
[C++]/백준 1987번 알파벳  (2) 2024.02.28

+ Recent posts