알고리즘/문제 해결 전략
다이나믹프로그래밍 DP (=동적계획법) [문제 해결 전략]
지니어스팍
2023. 9. 2. 16:22
728x90
728x90
다이나믹 프로그래밍 DP ( = 동적 계획법)
하나의 큰 문제를 여러개의 작은 문제로 나눠서 그 결과를 저장하여 다시 큰 문제를 해결할 때 사용하는 문제 해결 법을 말한다.기억하며 풀기라고 할 수 있다.
다이나믹 프로그래밍은 분할정복과 비슷한데 여기서 주어진 문제를 나눌 때 부분 문제를 최대한 많이 이용하도록 나눈 후 주어진 부분 문제의 정답을 한 번만 계산하고 저장해둔 뒤 다음에 또 나오면 저장해둔 정답을 사용하며 속도를 향상시킨다.
방법론 1. 메모이제이션
배열로 -1 -1 -1 입력한 상태에서 부분적으로 답이 나오면 채워 넣는다.
이미 채워져있을 경우 그 값을 사용한다.
function fibbo(n)
if memo[n] != -1 // 이미 n번째 값을 구해본 적이 있다면
return memo[n] // memo에 적혀있는 값을 반환해줍니다.
if n <= 2 // n이 2이하인 경우에는 종료 조건이므로
memo[n] = 1 // 해당하는 숫자를 memo에 넣어줍니다.
else // 종료조건이 아닌 경우에는
memo[n] = fibbo(n - 1) + fibbo(n - 2) // 점화식을 이용하여 답을 구한 뒤
// 해당 값을 memo에 저장해줍니다.
return memo[n] // memo 값을 반환합니다.
방법론 2.타뷸레이션
for 문을 이용하고 배열을 순서대로 채워나가는 방식
set dp = [0, 0, 0, ...]
dp[1] = 1
dp[2] = 1
for i = 3 ... i <= n:
dp[i] = dp[i - 1] + dp[i - 2]
print(dp[n])
이론적인 시간 복잡도는 같으나 하향식은 함수를 재귀적으로 여러번 시행해야하므로 타뷸레이션 접근식이 더 빠르다
728x90
728x90