티스토리 뷰
728x90
https://www.acmicpc.net/problem/1052
- 해설 :
N개의 물병과 K라는 수가 주어진다. N개의 물병에는 모두 물이 1리터씩 들어있고 같은 양이 들어있는 물병 두 개를 합쳐서 하나의 물병에다 옮길 수 있다. 물병의 개수를 K개로 줄이려고 할 때, 불가능한 경우가 생기지 않게 상점에서 적절하게 물병을 사려고 한다. 이 때, 물병을 사는 최소 개수를 찾는 문제이다. 상점에서 사는 물병엔 물이 1리터씩 들어있다.
- 풀이 :
한 번 연산할 때 물병의 개수는 반으로 줄어야 한다. 따라서, 물병을 K개 이하로 만드는 과정에서 물병의 개수가 홀수일 때 물병을 1개씩 사서 합치는 방법이 가장 그리디하다. 반으로 나눈 물병의 개수를 카운트하기 위해 emptyGlass 변수를 사용하였다. 물병을 합칠 때마다 빈 물병이 하나씩 생기므로 빈 물병의 개수가 현재 남은 물병의 개수와 같은 점을 이용하였다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | if __name__ == "__main__": N,K = map(int,input().split()) buyCnt = 0 emptyGlass = 0 if N <= K: print(0) exit() while True: buyCnt += 1 emptyGlass = 0 tmp = N while tmp != 0: if tmp%2 != 0: emptyGlass += 1 tmp = tmp//2 if emptyGlass<=K: break N+=1 print(buyCnt-1) | cs |
320x100
'Algorithm > Greedy' 카테고리의 다른 글
(Python) - BOJ(1541번) : 잃어버린 괄호 (0) | 2022.01.27 |
---|---|
(Python) - BOJ(1449번) : 수리공 항승 (0) | 2022.01.26 |
(Python) - BOJ(1080번) : 행렬 (0) | 2022.01.25 |
(Python) - BOJ(1049번) : 기타줄 (0) | 2022.01.25 |
(Python) - 프로그래머스 : 체육복 (0) | 2022.01.18 |
댓글
© 2022 WonSeok, All rights reserved