1 분 소요

1. 문제

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 출력한다.

// 예제 입력 1 
3 1

// 예제 출력 1 
1

// 예제 입력 2 
13 2

// 예제 출력 2 
3

// 예제 입력 3 
1000000 5

// 예제 출력 3 
15808


2. 핵심 아이디어

  • 1병 이상 존재하는 최소 물의 양 찾기
  • 최소 물의 양만큼 물 구입
  • 물 합치기


3. Python 문제풀이

import sys
input = sys.stdin.readline

n, k = map(int, input().split())
cnt = 0

while bin(n).count('1') > k :
  idx = bin(n)[::-1].index('1')
  cnt += 2 ** idx
  n += 2 ** idx

print(cnt)


4. Java 문제풀이


댓글남기기