문제풀이/BOJ

[Python] BOJ/백준 9009번 피보나치

서채리 2022. 9. 6. 22:20

[문제]

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

 

9009번: 피보나치

입력 데이터는 표준입력을 사용한다. 입력은 T 개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 테스트 데이터의 수를 나타내는 정수 T 가 주어진다. 각 테스트 데이터에는 하나의 정수 n

www.acmicpc.net

 

[풀이]

우선 피보나치 리스트를 만들어 올바른 값을 미리 넣어준다.

문제에 n의 최댓값이 1,000,000,000이라고 했기 때문에 44번 째 피보나치 수열까지만 구하면 된다. 

 

만들 수 있는 숫자 중 최소 개수로 n을 만들기 위해서는 n 이하의 수 중 가장 n과 가까운 수를 써야 한다.

문제에 나온 예시처럼 100을 만들기 위해서는 (3 + 8 + 89) 도 가능하지만 (3 + 8 + 34 + 55) 도 가능하기 때문에 34 + 55 인 수인 89를 사용하는 것이 더 적은 개수를 사용한 것이 된다.

 

그러므로 넉넉하게 46부터 시작해 100보다 같거나 작은 수가 나왔을 때 해당 수를 result 리스트에 넣고 n에서 해당 수를 빼 n이 0이 될때까지 반복하면 최소 개수를 만들 수 있다.

 

최소수의 피보나치 수들을 증가하는 순서로 출력해야 하기 때문에 sort() 함수를 이용해 정렬한 다음 출력하면 된다.

 

 

[코드]

import sys

fibo = [0, 1]
for i in range(2, 47):
    fibo.append(fibo[i-1] + fibo[i-2])

for _ in range(int(sys.stdin.readline())):
    n = int(sys.stdin.readline())
    result = []
    while n:
        for k in range(46, 1, -1):
            if fibo[k] <= n:
                number = fibo[k]
                n -= number
                result.append(number)
                break

    result.sort()
    for i in result:
        print(i, end=' ')
    print()