1️⃣ 다이나믹 프로그래밍
다이나믹 프로그래밍은
메모리를 적절히 사용하여 수행 시간 효율성을 비약적으로 향상시키는 방법
입니다.
이미 계산된 결과(작은 문제)는 별도의 메모리 영역에 저장하여 다시 계산하지 않도록 합니다.
다이나믹 프로그래밍의 구현은 일반적으로 두 가지 방식(탑다운과 보텀업)으로 구성됩니다.
다이나믹 프로그래밍은
동적 계획법
이라고도 부릅니다.
일반적인 프로그래밍 분야에서 동적(Dynamic)이란 어떤 의미를 가질까요?
자료구조에서 동적 할당(Dynamic Allocation)은 ‘
프로그램이 실행되는 도중 실행에 필요한 메모리를 할당하는 기법
’을 의미합니다.
반면에 다이나믹 프로그래밍에서 ‘다이나믹’은
별다른 의미 없이 사용된 단어
입니다.
2️⃣ 다이나믹 프로그래밍의 조건
다이나믹 프로그래밍은 문제가 다음의 조건을 만족할 때 사용할 수 있습니다.
최적 부분 구조(Optimal Substructure)
큰 문제를 작은 문제로 나눌 수 있으며 작은 문제의 답을 모아서 큰 문제를 해결할 수 있습니다.
중복되는 부분 문제(Overlapping Subproblem)
동일한 작은 문제를 반복적으로 해결해야 합니다.
3️⃣ 피보나치 수열
피보나치 수열을 단순 재귀 함수로 해결하면 지수 시간 복잡도를 가지게 됩니다.
다음과 같이 $f(2)$가
여러 번 호출
되는 것을 확인할 수 있습니다.
4️⃣ 피보니치 수열의 효율적인 해법 : 다이나믹 프로그래밍
다이나믹 프로그래밍의 사용 조건을 만족하는지 확인합니다.
최적 부분 구조 : 큰 문제를 작은 문제로 나눌 수 있습니다.
중복되는 부분 문제 : 동일한 작은 문제를 반복적으로 해결합니다.