๐ Dynamic Programming(DP)
๐ Dynamic Programming
๐ Dynamic Programming์ด๋?
- ๋ณต์กํ ๋ฌธ์ ๋ฅผ ํ ๋, ์์ ๋ฌธ์ ๋ฅผ ํ์ด๊ฐ๋ฉฐ ์ ์ฒด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ
- ์ด ๋ฐฉ์์ผ๋ก ์ค๋ณต ๊ณ์ฐ์ ํผํ๊ณ ๋ฌธ์ ๋ฅผ ๋ ํจ์จ์ ์ผ๋ก ํด๊ฒฐํ ์ ์๋๋ก ๋์์ค๋ค.
- ์ฃผ๋ก ์ต์ ํ ๋ฌธ์ ์์ ์ฌ์ฉ๋๋ค.
๐ก ํต์ฌ ์์ด๋์ด
- ๋ถํ ์ ๋ณต๊ณผ ๋น์ทํ์ง๋ง, ์ค๋ณต๋ ๋ถ๋ถ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋์ ํจ์จ์ฑ์ ์ด์ ์ด ๋จ
- ๋ฌธ์ ๋ฅผ ๋ ์์ ํ์ ๋ฌธ์ ๋ก ๋๋๊ณ , ๊ฐ ํ์ ๋ฌธ์ ๋ฅผ ํ๋ฒ๋ง ํ์ด ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ ํ ์ฌ์ฌ์ฉํ๋ค.
๐ก DP์ ๋๊ฐ์ง ์ค์ํ ์์
- ์ค๋ณต๋ ๋ถ๋ถ ๋ฌธ์
- ๋ฌธ์ ๋ฅผ ์ฌ๋ฌ๋ฒ ํ ๋ ๋์ผํ ํ์ ๋ฌธ์ ๊ฐ ๋ฐ๋ณตํด์ ๋ฑ์ฅํ ๋๊ฐ ์๋ค.
- ์๋ฅผ ๋ค์ด, ํผ๋ณด๋์น ์์ด์์ fib(5)๋ฅผ ๊ณ์ฐํ ๋ fib(4)์ fib(3)์ ๋ฐ๋ณต์ ์ผ๋ก ๊ณ์ฐํด์ผ ํ๋ฏ๋ก ์ค๋ณต ๊ณ์ฐ์ด ๋ฐ์ํ๋ค. ์ด๋ด๋ DP๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ฒ๋ง ๊ณ์ฐํ๊ณ ๊ณ์ฐ์ ์ ์ฅํด๋๊ณ ์ฌ์ฌ์ฉํ๋ค
- ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ
- ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ํ์ ๋ฌธ์ ์ ์ต์ ํด๊ฒฐ ๋ฐฉ๋ฒ ์ด ์ ์ฒด ๋ฌธ์ ์ ์ต์ ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก ์ด์ด์ง๋ค๋ ํน์ฑ์ด ์์ด์ผํ๋ค.
๐ DP์ ์ฃผ์ ์ ๊ทผ ๋ฐฉ์
- **ํ๋ค์ด(Top - Down) ๋ฐฉ์(์ฌ๊ท + ๋ฉ๋ชจ์ด์ ์ด์
)**
- ์ฌ๊ท๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ , ๊ทธ ๊ณผ์ ์์ ๊ณ์ฐํ ๊ฐ์ ๋ฉ๋ชจ์ด์ ์ด์ ์ ํตํด ์ ์ฅํ์ฌ ์ค๋ณต๊ณ์ฐ์ ํผํจ
- ๋ฉ๋ชจ์ด์ ์ด์ ์ ๊ณ์ฐ๋ ๊ฐ์ ๋ฐฐ์ด์ด๋ ํด์ฌ๋งต์ ์ ์ฅํ๊ณ , ๋์ผํ ํ์ ๋ฌธ์ ๊ฐ ๋ฑ์ฅํ ๋ ๊ทธ ๊ฐ์ ๋ฐ๋ก ์ฐธ์กฐ ํ๋ ๋ฐฉ์์ด๋ค.
๐ป ํ๋ค์ด ์์
#include <iostream>
#include <vector>
std::vector<int> memo(100, -1); // -1๋ก ์ด๊ธฐํ, ๋ฒกํฐ์ ์ด๊ธฐ ์ด๊ธฐํ๊ฐ์ -1 ์ด๋ค.
int fib(int n) {
if (n <= 1) return n; // 1์ผ ๋ ๊ฐ์ ๋น์ฐํ 1(1๊ฐ์ง ๋ฐฉ๋ฒ)
if (memo[n] != -1) return memo[n]; // ์ด๋ฏธ ๊ณ์ฐ๋ ๊ฐ์ด ์์ผ๋ฉด ๋ฐํ
memo[n] = fib(n-1) + fib(n-2); // ๊ณ์ฐ ํ ์ ์ฅ, ์ฌ๊ท
return memo[n];
}
int main() {
std::cout << fib(10) << std::endl; // 55
return 0;
}
- ๋ฐํ
์
(Bottom - up) ๋ฐฉ์(๋ฐ๋ณต๋ฌธ + ํ
์ด๋ธ)
- ๋ฌธ์ ๋ฅผ ์์ ํ์ ๋ฌธ์ ๋ถํฐ ์ฐจ๊ทผ์ฐจ๊ทผ ํ์ด๋๊ฐ๋ฉด์ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํ ์ด๋ธ(๋ฐฐ์ด, ๋ฆฌ์คํธ) ๋ฑ์ ์ ์ฅํด๊ฐ๋ค.
- ๋ฐ๋ณต๋ฌธ์ ํธ์ถํ๋ฏ๋ก ์ค๋ฒํค๋๊ฐ ์๋ค , ํ๋ค์ด ๋ฐฉ์์ ์ค๋ฒํ๋ก์ฐ๊ฐ ๋ฐ์๊ฐ๋ฅ์ฑ์ด ์๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ํ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ , ์ต์ข ์ ์ผ๋ก ์ํ๋ ๊ฐ์ ํ ์ด๋ธ์์ ์ฐพ์ ๋ฐํํ๋ค.
๐ป ๋ฐํ ์ ์์
int fib(int n) {
std::vector<int> dp(n+1, 0);
dp[1] = 1;
for (int i = 2; i <= n; ++i) {
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
}
๐ Dynamic Programming์ ์ฌ์ฉ ์์
- ํผ๋ณด๋์น ์์ด
- fib(n) = fib(n-1) + fib(n-2)๋ก ์ ์๋๋ฉฐ, DP๋ฅผ ์ฌ์ฉํ๋ฉด ์ค๋ณต ๊ณ์ฐ์ ํผํ ์ ์๋ค.
- ๋ฐฐ๋ญ ๋ฌธ์
- ์ฃผ์ด์ง ๋ฌผ๊ฑด์ ๋ฌด๊ฒ์ ๊ฐ์น๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ํ๋ ๋ฌด๊ฒ ๋ด์์ ์ต๋ ๊ฐ์น๋ฅผ ๊ตฌํ๋ ๋ฌธ์ , ๊ฐ ๋ฌผ๊ฑด์ ํฌํจํ๊ฑฐ๋ ํฌํจํ์ง ์๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํ์ฌ ์ต์ ํด๋ฅผ ์ฐพ๋๋ค.
- ์ต๋จ ๊ฒฝ๋ก ๋ฌธ์
- ๊ทธ๋ํ์์ ๋ ์ ์ฌ์ด์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ๋ ๋ฌธ์ ๋ก, DP๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ๊ฒฝ๋ก๋ฅผ ํ์ํ๊ณ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ณ์ฐํ๋ค.
- ๋ฌธ์์ด ํธ์ง ๊ฑฐ๋ฆฌ
- ๋ ๋ฌธ์์ด์ ํ๋๋ก ๋ฐ๊พธ๋ ์ต์ ์์ ํ์๋ฅผ ์ฐพ๋ ๋ฌธ์ ๋ก, ์ฝ์ , ์ญ์ , ๊ต์ฒด๋ฅผ ์ต์ํํ๋ ๋ฐฉ๋ฒ์ ๊ตฌํ๋ค.
๐ ์ ๋ฆฌ
์ฅ์
- ํจ์จ์ฑ : ์ค๋ณต ๊ณ์ฐ์ ํผํ ์ ์๊ธฐ ๋๋ฌธ์, ์๊ฐ ๋ณต์ก๋๊ฐ ํฌ๊ฒ ์ค์ด๋ ๋ค.
- ๋ฌธ์ ํด๊ฒฐ ๋ฅ๋ ฅ : ๋ณต์กํ ๋ฌธ์ ๋ฅผ ์์ ํ์ ๋ฌธ์ ๋ก ๋๋์ด ํด๊ฒฐํ ์ ์๋ค.
๋จ์
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ : DP๋ ํ์ ๋ฌธ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํด์ผํ๋ฏ๋ก ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ํ์
- ๋ฌธ์ ๊ตฌ์กฐ๊ฐ ์ ํฉํด์ผ ํจ : ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ + ์ค๋ณต๋ ๋ถ๋ถ ๋ฌธ์ ๋ฅผ ๊ฐ์ง๋ ๋ฌธ์ ์๋ง ์ ํจ