백준 9009(Python) 풀이 : 카드 합체 놀이



백준 9009 문제

백준 9009 파이썬
백준 9009



백준 9009 풀이

머리 아파 죽는 줄 알았다. 피보나치 수열을 어떻게 구현할지 몰라서 머리 아파 하던 중에 f(0)이 0이고, f(1)이 1이란 점에서 좀 해답을 찾은 것 같다.

어차피 모든 수는 1을 다 더하면 표현할 수 있기 때문에, 모든 수는 피보나치 수열의 합이다. 그런데, 이걸 가장 적은 피보나치 수열의 합으로 표현하기 위해서는 주어진 수에서 가장 큰 피보나치 수열을 계속 빼 나가면 된다.

아래는 그걸 코드로 구현한 것이다.

# 9009

# 입력 받기
t= int(input())

for _ in range(t):
    n = int(input())
    
    # 피보나치 수열 담을 빈 리스트
    lst=[]
    # 피보나치 수열 처음 
    b=1 #f(1)
    c=0 #f(0)

    # 피보나치 수열로 반복 돌리며 최대일 때 빼기
    while True:
        a= b+c
        if n<a:
            lst.append(b)
            n-=b
            if n==0:
                break
            #피보나치 초기화
            b=1
            c=0
        #피보나치 다음항
        else:
            c=b
            b=a
    #역순으로 출력
    for i in lst[::-1]:
        print(i, end=' ')
    print()




CATEGORIES:

Tags:

No Responses

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다