문제 한눈에 보기
| 목표 | n번째 피보나치 수 구하기 |
| 핵심 개념 | 재귀 + 메모이제이션(하향식 DP) |
| 점화식 | fib(n) = fib(n-1) + fib(n-2) |
핵심 1
일반 재귀는 같은 값을 계속 다시 계산해서 매우 느리다.
핵심 2
이미 구한 값은
memo 에 저장해서 재사용한다.핵심 3
메모이제이션의 흐름은 확인 → 계산 → 저장 → 반환 이다.
최종 코드
def fib_memo(n, memo=None):
if memo is None:
memo = {}
if n in memo:
return memo[n]
if n == 0:
return 0
if n == 1:
return 1
memo[n] = fib_memo(n - 1, memo) + fib_memo(n - 2, memo)
return memo[n]
n = int(input())
print(fib_memo(n))
한 줄씩 설명
| 줄 | 코드 | 설명 |
|---|---|---|
| 1 | def fib_memo(n, memo=None): |
n번째 피보나치 수를 구하는 함수다. |
| 2-3 | if memo is None: |
처음 호출일 때만 빈 딕셔너리를 만든다. |
| 5-6 | if n in memo: |
이미 계산한 값이면 바로 반환한다. |
| 8-11 | if n == 0: return 0 |
피보나치의 기저 조건이다. |
| 13 | memo[n] = fib_memo(n - 1, memo) + fib_memo(n - 2, memo) |
아직 없는 값이면 재귀로 계산해서 저장한다. |
| 14 | return memo[n] |
저장한 값을 반환한다. |
왜 DP인가?
fib(5)를 일반 재귀로 구하면 fib(3), fib(2)를 여러 번 다시 계산한다. 하지만 메모이제이션을 쓰면 각 값은 한 번만 계산되어 시간 복잡도가 O(n) 으로 줄어든다.
시간복잡도
O(n)
공간복잡도
O(n) (memo + 재귀 스택)
한 문장 정리
피보나치 수 2는 메모이제이션을 이용해 중복 계산을 제거하는 가장 대표적인 DP 입문 문제다.
'크래프톤 정글 > 정글에서 문제풀기' 카테고리의 다른 글
| [정글 알고리즘] - [하] 백준1541- 잃어버린 괄호- 실버2 (0) | 2026.03.28 |
|---|---|
| [정글 알고리즘] - [하] 백준1904- 01타일- 실버3 (1) | 2026.03.28 |
| [정글 베이직29]그리디 - 회의실 배정 (0) | 2026.03.28 |
| [정글 베이직28]그리디 알고리즘 - 거스름돈 (0) | 2026.03.28 |
| [정글 베이직27]동적 프로그래밍 - 계단 오르기 (상향식 / Bottom-up) (0) | 2026.03.28 |