본문 바로가기
ALGORITHM/백준

[BOJ/PYTHON] 9009. 피보나치

by 뭉망뭉 2023. 5. 25.

백준 문제 링크: https://www.acmicpc.net/problem/9009

문제 요약

피보나치 수들의 합이 주어진 정수와 같게 되는 최소 개수의 서로 다른 피보나치 수 구하기

핵심 아이디어 및 풀이

피보나치 리스트를 먼저 구하고 시작하면 된다. 이때, 입력이 최대 1,000,000,000이기에 피보나치를 50번째까지 구해줬다. (사실 50번째까지 안 가도 되는데 0으로 딱 끝내려고 이렇게 했다)

최소 개수가 되려면 그리디하게 제일 큰 값부터 넣어보면 되기에 피보나치 리스트를 큰 값부터 내림차순으로 정렬한다.

피보나치 리스트를 순서대로 돌면서 입력값보다 피보나치가 딱 작아지는 순간부터를 answer list에 append해줬다. 그리고 append한 수만큼을 입력값에서 빼 다음 피보나치를 구하면 된다.

피보나치 수열을 큰 것부터 거꾸로 봤기 때문에 출력 시에는 다시 뒤집어서 출력하면 된다. 피보나치 수열이 원래 점점 커지는 형태이기에 정렬해줬다.

풀이

# silver1-9009. 피보나치

import sys
input = sys.stdin.readline

# 최소 개수 되려면 제일 큰 값부터 넣어보면 됨

fibonacci = [0]*50
fibonacci[0] = 0
fibonacci[1] = 1
for i in range(2, 50):
    fibonacci[i] = fibonacci[i-1] + fibonacci[i-2]
fibonacci.sort(reverse=True)

t = int(input()) 
for _ in range(t):
    num = int(input()) 
    answer_list = []
    for fibo_num in fibonacci:
        if fibo_num <= num and num != 0: # num이 0이 아닌 한도 내에서 가장 큰 피보나치 수
            answer_list.append(fibo_num)
            num -= fibo_num
    print(*sorted(answer_list))

 

실행 시간

메모리 31256KB, 시간 52ms (python3)

'ALGORITHM > 백준' 카테고리의 다른 글

[BOJ/PYTHON] 1026. 보물  (1) 2023.05.25
[BOJ/PYTHON] 15889. 호 안에 수류탄이야!!  (0) 2023.05.25
[BOJ/PYTHON] 2437. 저울  (0) 2023.05.25
[BOJ/PYTHON] 2003. 수들의 합 2  (0) 2023.05.25
[BOJ/PYTHON] 13904. 과제  (0) 2023.05.24

댓글