다이나믹
의 의미는? 단순히 멋져보여 붙여진 이름이라고 한다. 메모리 동적 할당에서의 '다이나믹' 의미와는 연관성이 없다!
탑다운(Top Down)
방식 - 메모이제이션재귀 함수
를 사용해 구현하는 경우메모이제이션
: 이전에 계산된 결과를 일시적으로 기록해놓는 개념보텀업(Bottom Up)
방식 - 다이나믹 프로그래밍의 전형적인 형태반복문
을 이용해 소스코드를 작성하는 경우DP Table
: 보텀업 방식에서 사용되는 결과 저장용 리스트메모이제이션
dict
...)을 이용할 수도 있음ex) 피보나치 수열
작은 문제들이 반복되고 그 작은 문제들의 결과 값이 항상 같으므로 이전에 계산된 작은 문제를 저장할 때 memoization
사용
다이나믹 프로그래밍과 메모이제이션은 별도의 개념이므로 혼용해 사용하지 말자!
완전 탐색 알고리즘으로 접근하였을 때 시간이 오래 걸리는 경우
→ 해결하고자 하는 부분 문제들의 중복 여부를 확인
→ 먼저 단순 재귀함수로 비효율적 프로그램을 작성해볼 것 (Top Down)
→ 작은 문제에서 구한 답이 큰 문제에서 사용될 수 있는 경우, 메모이제이션 기법을 적용해 수정해볼 것
탑다운
보다 보텀업
방식 권장
recursiondepth
(재귀함수 깊이) 오류가 발생할 수 있음setrecursionlimit()
함수 호출을 통해 재귀 제한 완화f(n)
함수에서 n
이 커질수록 수행 시간이 기하급수적으로 늘어남 → sol. 메모이제이션
사용def fibo(x):
if x == 1 or x == 2:
return 1
return fibo(x - 1) + fibo(x - 2)
메모이제이션
을 사용해 재귀적으로 코드를 표현 - Top-Down DP
# 한 번 계산된 결과를 메모이제이션하기 위한 리스트 d 초기화
d = [0] * 100
# 피보나치 수열을 재귀함수로 구현 - 탑다운 방식의 DP
def fibo(x):
# 종료 조건(1 또는 2일 때 1을 반환
if x == 1 or x == 2:
return 1
# 이미 계산한 문제의 경우, 메모이제이션 리스트 d에 값이 있는 경우 그대로 반환
if d[x] != 0:
return d[x]
# 아직 계산하지 않은 문제의 경우, 점화식에 따라 메모이제이션 & 계산 값 반환
d[x] = fibo(x - 1) + fibo(x - 2)
return d[x]
DP 테이블
을 사용해 반복적으로 코드를 표현 - Bottom-Up DP
# 한 번 계산된 결과를 저장하기 위한 dp 테이블 초기화
d = [0] * 100
# 첫 번째 피보나치 수와 두 번째 피보나치 수 : 1
d[1] = 1
d[2] = 1
n = 99
# 반복문으로 피보나치 수열 구현 - 보텀업 DP
for in range(3, n + 1):
d[i] = d[i - 1] + d[i - 2]