본문으로 바로가기

[백준] 1052. 물병

category 알고리즘/백준 2023. 1. 12. 11:43

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

문제

지민이는 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을 출력한다.


N 개의 물병이 주어졌을 때 같은 크기의 물병을 합쳐서 K 개 이하로 만드는 문제.

물병을 합치는 방법을 나열해 보면 규칙을 찾을 수 있다.

N = 1 일 때 : [ 1 ]

N = 2 일 때 : [ 2 ]

N = 3 일 때 : [ 2, 1 ]

N = 4 일 때 : [ 4 ]

N = 5 일 때 : [ 4, 1 ]

N = 6 일 때 : [ 4, 2 ]

N = 7 일 때 : [ 4, 2, 1 ]

N = 8 일 때 : [ 8 ]

......

N 이 2의 제곱일 경우, 물병을 1개로 합칠 수 있다.

그리고 N 이 2의 제곱이 아닐 경우를 살펴보면, 최대한으로 합쳐서 나오는 물병의 갯수가 N 을 2진수로 바꾸었을 때 1이 나타나는 횟수와 같다.

ex) N = 3 를 2진수로 나타내면 11 , 물병 2개

N = 5 는 101, 물병 2개

... 이하 동일



코드 :

N 개의 물병을 시작으로 물병이 나누어 떨어지지 않을 때 +1 씩 하면서 상점에서 사야할 물병의 갯수를 카운트 해주었다.

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 1629번 곱셈  (0) 2023.02.08
[백준] 1309번 : 동물원  (0) 2023.01.19
[BaekJoon] 백준 1240. 노드사이의 거리  (0) 2022.09.27
[BaekJoon] 백준 12868번. 돌 그룹  (0) 2022.09.16
[BaekJoon] 백준 2482번 색상환  (0) 2022.09.14