반응형
[Silver IV] 피보나치 수 7 - 15624
성능 요약
메모리: 110576 KB, 시간: 100 ms
분류
다이나믹 프로그래밍, 수학
제출 일자
2025년 2월 6일 23:08:10
문제 설명
피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다.
이를 식으로 써보면 $Fn = Fn-1 + Fn-2 (n ≥ 2)$가 된다.
n=17일때 까지 피보나치 수를 써보면 다음과 같다.
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597
n이 주어졌을 때, n번째 피보나치 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 n이 주어진다. n은 1,000,000보다 작거나 같은 자연수 또는 0이다.
출력
첫째 줄에 n번째 피보나치 수를 1,000,000,007으로 나눈 나머지를 출력한다.
풀이
def main() :
n = int(input())
a, b = 0, 1
for _ in range(n) :
a, b = b, (a+b) % 1_000_000_007
print(a)
main()
전형적인 피보나치 수 문제이고 가장 일반적으로 쉬운 for 문 풀이로만 진행하였다.
MOD = 1_000_000_007
def main() :
n = int(input())
dp = [0] * 1_000_001
dp[1] = 1
for i in range(2, n+1) :
dp[i] = (dp[i-1] + dp[i-2]) % MOD
print(dp[n])
main()
두 번째는 다이나믹 프로그래밍을 활용해서 풀이를 진행하였고, 가장 대표적인 효율적인 두 풀이이다.
그러나 지금 문제에 제시된 수식을 보게 되면
MOD = 1_000_000_007
def fibo(n) :
if n <= 1 :
return n
else :
num = (fibo(n-2) + fibo(n-1)) % MOD
return num
def main() :
n = int(input())
res = fibo(n)
print(res)
main()
이런 식으로 구현이 가능하고, 이는 백준 기준으로는 RecursionError 가 나오게 된다.
로컬에서 돌려보니 첫번째 예시였던 10은 잘 나오는데 두번째 예시인 1,000 은 빠르게 도출되지 않았다.
따라서 재귀를 활용한 방법은 빠르게 접근이 가능하긴 하나, 적절하지 못한 모습이다. 혹시나 궁금하다면 직접 로컬에 구현해보길 바란다.
반응형
'알고리즘 스터디' 카테고리의 다른 글
[백준/파이썬][Silver III] Champernowne Count - 27569 (0) | 2025.02.07 |
---|---|
[백준/파이썬][Silver III] Contaminated Milk - 11972 (0) | 2025.02.07 |
[백준/파이썬][Silver V] 무한 문자열 - 12871 (0) | 2025.02.06 |
[백준/파이썬][Bronze II] Have you had your birthday yet? - 9948 (0) | 2025.02.06 |
[백준/파이썬][Gold V] 종이 접기 - 12979 (0) | 2025.02.04 |