본문 바로가기
알고리즘/[python] 백준 BOJ

[python] 백준 2885 초콜릿 식사

by Alan_Kim 2023. 4. 7.
728x90
반응형

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

 

2885번: 초콜릿 식사

학교 근처 편의점에 새 초콜릿이 들어왔다. 이 초콜릿은 막대 모양이고, 각 막대는 정사각형 N개로 이루어져 있다. 초콜릿의 크기(정사각형의 개수)는 항상 2의 제곱 형태이다. 즉, 1, 2, 4, 8, 16, ...

www.acmicpc.net

 

문제 해결

  • n은 2의 거듭제곱식이다.
  • n =1부터 k보다 커질때 까지 2를 계속 곱한다. (그 것이 최소 크기이다.)
  • 모든 수는 2의 거듭제곱 수의 합으로 나타낼 수 있다.
  • 따라서 k를 2의 거듭제곱 수의 합으로 표현할 때 최소 2의 지수를 보고 그 넓이의 초콜릿을 만드는데 몇 번 잘라야되는지 계산하면 끝

 

CODE

k = int(input())
n = 1
while n<k:
    n *= 2
ans_1 = n
cnt = 0

while n >1:
    n = n//2
    cnt += 1

x = k
i = 0
memo = [0]*(cnt+1) # 1,2,4,8,16... 넓이의 초콜릿 개수
while x >= 1:
    if x%2 == 1:
        memo[i] += 1
    else:
        memo[i] = 0
    x = x//2
    i += 1
for i in range(cnt+1):
    if memo[i] >= 1:
        ans_2 = cnt-i
        break

print(ans_1, ans_2)
728x90
반응형

댓글