문제 설명
1. 1부터 1,000,000,000 까지의 범위를 갖는 n이 주어집니다.
2. 피보나치 수열을 최소의 개수로 더해서 n을 만들었을 때 결과를 리턴해야 합니다.
알고리즘
1. 주어진 범위 내에서 가능한 피보나치 수열을 리스트에 담습니다. (1 ≤ n ≤ 1,000,000,000)
2. 이분 탐색 알고리즘을 통해 n보다 작거나 같은 수를 찾습니다.
3. n에서 찾은 수를 빼줍니다.
4. n이 0이 될 때 까지 2~3번 과정을 반복합니다.
코드
import sys
# sys.stdin = open("C:/Users/JIn/PycharmProjects/coding_Test/input.txt", "rt")
fibo = [0, 1]
idx = 0
while fibo[idx + 1] < 1000000000:
fibo.append(fibo[idx] + fibo[idx + 1])
idx += 1
t = int(input())
for _ in range(t):
n = int(input())
stack = []
lt = 0
rt = len(fibo) - 2
while n != 0:
while lt <= rt:
mid = (lt + rt) // 2
if fibo[mid] > n:
rt = mid - 1
else:
lt = mid + 1
n -= fibo[rt]
stack.append(fibo[rt])
lt = 0
stack.reverse()
print(*stack)
'코딩 테스트' 카테고리의 다른 글
[14938 백준] 서강그라운드 - 다익스트라 알고리즘 (0) | 2021.02.17 |
---|---|
[백준 10775] 공항 - 유니온파인드(union-find) 문제 (0) | 2021.02.16 |
[백준] 11967 불켜기 (0) | 2021.02.10 |
[프로그래머스] 타겟 넘버 (0) | 2021.02.08 |
[백준, 7490] 0 만들기 (0) | 2021.02.02 |