[백준-1052] 물병

5504 단어 그리디그리디

문제

링크

코드

  • 참고
    링크
    넘넘감사합니다..................................................죽어가던절살리셧어요
n, k = map(int, input().split())

bottle = 0

# 2진수로 변환한 후 1의 개수가 현재 물병의 수
# 그러므로 1의 개수가 K보다 작아야 끝난다.
while bin(n).count('1') > k :
    # 뒤에서부터 1의 인덱스를 구한 후
    i = bin(n)[::-1].index('1')
    # N에 더해주기
    n += (2**i)
    # 그리고 그만큼 물병 수 증가
    bottle += (2**i)

print(bottle)
  • 기존 코드
n, k = map(int, input().split())

i = 0
bottle = 0
while True :
    if n <= k :
        break
    tmp = n // 2
    if n % 2 != 0 :
        bottle += (2**i)
        n = tmp + 1
    else :
        n = tmp
    i += 1

print(bottle)

기존에는 2씩 나누고 반복문을 진행했다.
i가 0부터 시작해서 반복문이 돌아갈 때마다 1씩 더해지도록 했다.
2로 나눠지지 않을 경우 1씩 더하고 2^i를 더해줬다.

나오는 답은 1병으로 만드는 방법이었다.
처음에 2진수로 생각했지만, 코드를 짤 때는 잘못 생각했나보다..ㅠㅠ

새롭게 알게된 부분

  • 문자열 거꾸로 출력하기
    array = 123456
    [::-1] 을 하면
    array[::-1] = 654321

링크

  • 숫자를 다른 진수로 변환
    - 2진수로 변환 : bin(숫자)
    - 8진수로 변환 : oct(숫자)
    - 16진수로 변환 : hex(숫자)
  • 다른 진수를 숫자로 변환
    - 2진수를 변환 : int(2진수, 2)
    - 8진수를 변환 : int(8진수, 8)
    - 16진수를 변환 : int(16진수, 16)

링크

좋은 웹페이지 즐겨찾기