동적 계획법(DP)은 복잡하고 거대한 문제를 아주 작은 단위의 하위 문제(Sub-problem)들로 쪼개어 풀되, 동일한 연산이 반복될 때 그 결과값을 저장(캐싱)하여 재사용함으로써 중복 연산을 극적으로 줄이는 기법입니다. "기억하며 풀기"라고도 부릅니다.
피보나치 수열을 단순 재귀 함수로 구현하면 F(3)이나 F(2) 같은 똑같은 함수를 수백, 수천 번 반복 호출하게 됩니다. 이를 해결하는 마법이 바로 메모이제이션입니다.
● 중복 연산 방지 : 한 번 뼈빠지게 계산해 낸 결과는 memo 배열이나 딕셔너리에 몰래 적어(저장해) 둡니다.
● Cache Hit! : 이후 또다시 똑같은 함수 호출이 들어오면, 로직을 실행하지 않고 노트(캐시)에 적어둔 답만 O(1)의 속도로 쓱 꺼내서 반환합니다.
● 시간 복잡도의 마법 : 우주가 멸망할 때까지 걸린다는 최악의 O(2^N) 지수 시간이, DP를 적용하는 순간 선형 시간인 O(N)으로 단축되는 기적을 보여줍니다.
| 방식 | 구현 방법 | 장점 및 특징 |
|---|---|---|
| Top-Down (하향식) |
재귀함수 + Cache(Memo) | 큰 문제부터 시작해 작은 문제로 파고듭니다. 수학적 점화식을 직관적으로 코드로 옮기기 쉬우나, 콜 스택(Call Stack) 깊이 초과 에러가 발생할 위험이 있습니다. |
| Bottom-Up (상향식) |
반복문(for) + DP Table(Array) | 작은 문제부터 차근차근 배열을 채워 올라갑니다. 콜 스택 오버플로우 걱정이 없고 성능 튜닝에 유리해 실무 및 코딩테스트에서 가장 권장되는 방식입니다. |