: 이미 계산된 결과는 별도의 메모리 영역에 저장하여 다시 계산하지 않도록 하는 방법. 시간 효율성을 비약적으로 향상시킨다.
자료구조에서 dynamic 이란?
: 프로그램이 실행되는 도중에 실행에 필요한 메모리를 할당하는 기법
(그러나 여기서는 별다른 의미 없이 사용됨)
언제 사용 가능한가요?
1. 최적 부분 구조
: 큰 문제를 작은 문제로 나눌 수 있고, 작은 문제의 답을 모아 큰 문제를 해결할 수 있음. → 어떤 문제에 대한 해가 최적일 때, 그 해를 구성하는 부분 문제들의 해 역시 최적이다.
2. 중복되는 부분 문제
: 동일한 작은 문제를 반복적으로 해결해야 할 때
점화식 :
def fibo(x):
if x==1 or x==2:
return 1
return fibo(x-1) + fibo(x-2)
→ fibo(6)의 계산 과정을 그래프화 함.
: 한 번 계산한 결과를 메모리 공간에 메모하는 기법. 같은 문제를 다시 호출하면 메모했던 결과를 그대로 가져옴. (= 캐싱, caching)
다이나믹 프로그래밍에 국한된 개념은 아님
d = [0]*100
def fibo_top(x):
if x==1 or x==2:
return 1
if d[x]!=0:
return d[x]
d[x] = fibo(x-1) + fibo(x-2)
return d[x]
d=[0]*100
d[1] = 1
d[2] = 1
n = 99
for i in range(3, n-1):
d[i] = d[i-1] + d[i-2]
print(d[n])
→ 메모이제이션 기법을 활용한 계산 과정
👀 주어진 문제가 다이나믹 프로그래밍 유형인지 파악하는 것이 중요하다!
그리디, 구현, 완전 탐색 등의 아이디어로 문제를 해결할 수 있는지 검토한 후, 풀이 방법이 떠오르지 않으면 다이나믹 고려하자.
일단 재귀함수로 비효율적인 완전 탐색 프로그램 작성
→ 작은 문제에서 구한 답이 큰 문제에서 그대로 사용될 수 있는가?
→ 코드 개선
일반 코테를 대비하기 위해서는 기본 유형만 숙지해도 괜찮다