백준 1052 물병

wook2·2022년 3월 3일
0

알고리즘

목록 보기
69/117

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

같은 크기의 물병을 합쳐서 크기가 2배인 물병을 만든다는 것을 잘 이해하는것이 중요한 문제였다.
위의 내용을 비트로 생각해보면 비트마스킹을 통해 문제를 해결할 수 있겠다라는 생각이 든다.

어떤 수 n 이 있을때 이를 2진수로 나타내면, 비트가 켜진것의 갯수가 물병을 추가하지 않았을 때, 최대한 줄일 수 있는 경우라는 것을 알 수 있다.

제일 처음에는 n에 1씩 더해가며 계산했는데, 그럴 필요가 없이, 비트가 켜진 위치에 1을 더해 해당 비트를 끄고 올림을 만들면 계산량을 확 줄일 수 있다.

n,k = map(int,input().split())
ans = 0
while True:
    count = bin(n).count('1')
    if count > k:
        idx = bin(n)[::-1].index('1')
        ans += 2**idx
        n += 2**idx
    else:
        break
print(ans)
profile
꾸준히 공부하자

0개의 댓글