Ch.10 다이나믹 프로그래밍

DP란? — 중복 부분문제와 최적 부분구조

Dynamic Programming이 무엇인지 직관적으로 설명한다중복 부분문제(Overlapping Subproblems)와 최적 부분구조(Optimal Substructure)를 구분한다DP가 적용 가능한 문제를 식별한다

같은 계산을 왜 반복하는가?

피보나치 수열을 재귀로 구현했더니 n=40에서 이미 수 초가 걸립니다. 그런데 단 한 줄을 추가하면 0.001초로 줄어듭니다.

재귀 트리를 그려보면, 같은 값을 수십 번씩 다시 계산하고 있었습니다.

한 번 계산한 결과를 저장해서 재사용 — 이것이 Dynamic Programming의 핵심입니다.

lightbulb

핵심 개념

Dynamic Programming

복잡한 문제를 작은 하위 문제로 나누고, 결과를 저장하여 재사용하는 기법

중복 부분문제

같은 하위 문제가 여러 번 반복되는 구조

최적 부분구조

전체 최적해가 부분 최적해로 구성되는 성질


article

핵심 내용

면접에서 가장 많이 나오는 주제, Dynamic Programming을 시작합니다

피보나치 수열을 재귀로 풀면 어떤 일이 벌어질까요?

python
def fib(n):
    if n <= 1:
        return n
    return fib(n - 1) + fib(n - 2)

print(fib(5))   # 5  — 빠름
print(fib(40))  # 102334155 — 매우 느림!

fib(40)을 구하려면 fib(39) + fib(38)을 호출하고, fib(39)는 또 fib(38) + fib(37)을 호출합니다. fib(38)이 이미 2번 계산됩니다!

fib(5)의 재귀 트리를 시각화해봅시다

fib(5) 호출 시 총 15번의 함수 호출 발생: • fib(3) — 2번 중복 • fib(2) — 3번 중복 • fib(1) — 5번 중복 • fib(0) — 3번 중복

n이 커질수록 중복은 지수적으로 폭발합니다. fib(40)은 약 3억 번의 호출을 합니다

이렇게 같은 하위 문제가 반복 계산되는 것을 중복 부분문제(Overlapping Subproblems)라 합니다

DP가 성립하려면 한 가지 조건이 더 필요합니다

최적 부분구조 (Optimal Substructure) 전체 문제의 최적 해답이 부분 문제의 최적 해답으로 구성될 수 있는 성질 예: 서울→부산 최단경로가 서울→대전→부산이면, 서울→대전 구간도 반드시 최단경로

피보나치: fib(n) = fib(n-1) + fib(n-2) 전체 답이 부분 답의 조합으로 구성됩니다

중복 부분문제 + 최적 부분구조 = DP 적용 가능

비슷해 보이는 세 기법, 핵심 차이를 정리합니다

분할정복 (Divide & Conquer) • 부분 문제가 겹치지 않음 (예: Merge Sort) • 결과 저장 불필요 그리디 (Greedy) • 매 순간 최선을 선택 → 되돌아가지 않음 • 최적 부분구조는 필요하지만, 중복 부분문제는 아님 DP • 부분 문제가 겹침 → 결과를 저장·재사용 • 모든 경우를 고려하되 중복 계산을 제거

DP = 완전탐색의 효율화 중복만 제거하면 지수 시간이 다항 시간으로 변합니다

DP를 구현하는 방법은 두 가지가 있습니다

Top-Down (메모이제이션) • 재귀 + 결과 캐싱 • 필요한 부분문제만 계산 Bottom-Up (타뷸레이션) • 반복문 + dp 배열 • 작은 문제부터 순서대로 채움

다음 두 강의에서 각각을 자세히 배웁니다

DP가 적용 가능한 두 가지 조건은?

fib(n)의 순수 재귀 시간복잡도는 O(n)이다

DP의 세계에 입문!

key

핵심 용어

🧩

Dynamic Programming

하위 문제의 결과를 저장·재사용하여 효율적으로 푸는 기법

🔄

중복 부분문제

같은 하위 문제가 여러 번 반복 계산되는 구조

🏗️

최적 부분구조

전체 최적해가 부분 문제의 최적해로 구성되는 성질

edit_note

정리 노트

DP란? — 중복 부분문제와 최적 부분구조

핵심 개념

Dynamic Programming
하위 문제 결과를 저장·재사용하여 중복 계산 제거
중복 부분문제
같은 하위 문제가 여러 번 반복 계산되는 구조
최적 부분구조
전체 최적해 = 부분 최적해의 조합

DP vs 유사 기법

분할정복
부분 문제가 겹치지 않음 (Merge Sort)
그리디
매 순간 최선 선택, 되돌아가지 않음
DP
완전탐색 + 중복 제거 = 다항 시간

면접에서 '이 문제에 DP를 쓸 수 있는 이유'를 설명하라는 질문이 자주 나옵니다!

image

시각 자료

다이어그램: ds-d75
다이어그램: ds-d76
check_circle

핵심 정리

  • 1DP = 중복 부분문제 + 최적 부분구조
  • 2순수 재귀 O(2^n) → DP 적용 시 O(n)
  • 3Top-Down(메모이제이션)과 Bottom-Up(타뷸레이션) 두 방식

퀴즈와 인터랙션으로 더 깊이 학습하세요

play_circle인터랙티브 레슨 시작