Python/기초문법
[알고리즘] Dynamic Programming (동적계획법) - Python
gangee
2023. 8. 16. 19:16
728x90
반응형
분할 정복 알고리즘
- 큰 문제를 한번에 해결하기 어려울 때, 여러개의 작은 문제로 나누어 해결하는 기법
- 이때 동일한 작은 문제들이 반복적으로 계산되는 경우가 생길 수 있음
- 이를 보완하기 위해 나온 방법이 다이나믹 프로그래밍
Dynamic Programming (동적계획법)
1. 의미
- 필요한 계산 값을 저장해두었다가 재사용하는 알고리즘 설계 기법
- 처음 진행되는 연산을 기록하고 이미 진행되었던 연산이라면 기록되어있는 값 호출 = 시간, 자원 절약 가능
- 모든 가능성을 고려하여 항상 최적의 결과 도출
2. 사용 조건
- 최적 부분 구조 : 큰 문제를 작은 문제를 나눌 수 있다. 이러한 작은 문제의 답을 모아 큰 문제를 해결할 수 있다.
- 중복된 하위 문제 : 동일한 작은 문제를 반복적으로 해결해야 한다.
3. 구현 방식
1. Memoization (Top-Down, 하향식)
- 재귀함수를 사용해 구현하는 다이나믹 프로그래밍 방법
- 큰 문제를 해결하기 위해 작은 문제를 호출
2. Tabulation (Bottom-Up, 상향식)
- 재귀함수를 사용하지 않고 단순 반복문을 사용해 구현하는 다이나믹 프로그래밍 방법
- 하위 문제부터 시작해서 더 큰 문제를 해결
- 수열처럼 연속적이지 않은 자료가 주어질 때 유용
4. 대표적인 예 (피보나치 수열)
- Top-Down
memo = [0]*100
# 피보나치 수열을 재귀함수로 구현
def fibo(x):
if x==1 or x==2:
return 1
# 이미 계산한 적있는 문제라면 그대로 반환
if memo[x] != 0:
return memo[x]
# 아직 계산하지 않은 문제라면 점화식에 따라서 피보나치 결과 반환
memo[x] = fibo(x-1)+fibo(x-2)
return memo[x]
print(fibo(6))
----------------------------------------------------------------------
> 8
- Bottom-Up
dp = [0]*100
# 피보나치 수열을 반복문으로 구현
dp[1]=1
dp[2]=1
n=6
for i in range(3, n+1):
dp[i] = dp[i-1]+dp[i-2]
print(dp[n])
-----------------------------------------------
> 8
참고
[Python] Dynamic Programming(동적계획법) 알고리즘
동적계획법(Dynamic Programming) 정리글_Python
[알고리즘] 다이나믹 프로그래밍 with Python
728x90
반응형