2025-09-01 02:00
타뷸레이션
동적 계획법 타뷸레이션
- 가장 작은 문제부터 차례대로 해결해 최종 답 구하는 상향식 접근법
- 재귀 호출의 비효율성(중복 계산, 스택 오버플로우) 해결하기 위해 반복문 사용해서 DP 테이블 채워나가는 식으로 동작
- 메모이제이션과 마찬가지로 동적 계획법이지만 재귀 없이 반복문으로 구현
작동 방식
- 테이블 만들기: 해결해야 할 문제의 크기에 맞게 DP 테이블을 생성합니다.
- 초기값 설정: 가장 작은 문제, 즉 우리가 이미 답을 알고 있는 ‘베이스 케이스(Base Case)‘에 해당하는 값을 테이블에 미리 채워 넣습니다.
- 점화식 기반 반복: 반복문을 통해 테이블을 순회하며, 이전에 계산된 값들(더 작은 하위 문제의 답)을 이용하여 다음 칸의 값을 계산합니다. 이때 사용되는 규칙이 바로 ‘점화식(Recurrence Relation)‘입니다.
- 최종 결과 도출: 반복문이 모두 끝나면 테이블이 완성됩니다. 우리가 원하는 최종 문제의 답은 테이블의 특정 위치(보통 가장 마지막 칸)에 저장되어 있습니다.
피보나치 예시
- 테이블 만들기:
n
까지의 피보나치 수를 저장해야 하므로, 크기가n+1
인 1차원 배열dp
를 만듭니다.dp[i]
는 i번째 피보나치 수를 의미합니다. - 초기값 설정: 피보나치 수열의 가장 작은 문제는
fib(0)
과fib(1)
입니다. 우리는fib(0) = 0
,fib(1) = 1
임을 이미 알고 있습니다. 따라서dp[0] = 0
,dp[1] = 1
로 설정합니다. - 점화식 기반 반복: 피보나치 수열의 점화식은
fib(i) = fib(i-1) + fib(i-2)
입니다. 이를 우리 DP 테이블에 맞게 바꾸면dp[i] = dp[i-1] + dp[i-2]
가 됩니다. 이제 i를 2부터 n까지 순회하는 반복문을 만들어 이 점화식을 적용합니다. - 최종 결과 도출: 반복문이 끝나면
dp[n]
에 우리가 원하는 n번째 피보나치 수가 저장되어 있습니다.
def fibonacci_tabulation(n):
if n <= 1:
return n
# 1. 테이블 만들기
dp = [0] * (n + 1)
# 2. 초기값 설정
dp[1] = 1
# 3. 점화식 기반 반복
for i in range(2, n + 1):
dp[i] = dp[i-1] + dp[i-2]
# 4. 최종 결과 도출
return dp[n]
print(fibonacci_tabulation(10)) # 결과: 55