그리디를 이용한 문제이다. 같은 양의 물이 들어있는 물병끼리는 하나로 합칠 수 있다. 그렇기에 N을 2로 나누어가다보면 최종적으로 남는 물이 들어있는 물병의 개수를 알 수 있다. 만약 개수가 K 이하라면 물병을 추가로 구매할 필요가 없다. 코드는 반복문을 통해 이를 반복하면서 추가로 구매한 물병의 개수를 세어 이를 출력해주었다. 어렵지 않게 풀 수 있었던 문제였다.
#include <iostream>
using namespace std;
int N, K, result = 0;
void solution() {
while (1) {
int count = 0;
int tmp = N + result;
while (tmp > 0) {
if (tmp % 2 == 0) {
tmp /= 2;
}
else {
tmp /= 2;
count++;
}
}
if (K >= count) break;
result++;
}
cout << result;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> N >> K;
solution();
return 0;
}