[์๊ณ ๋ฆฌ์ฆ] DP(Dynamic Programming)๋?
DP๋?
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ ๋์ ๊ณํ๋ฒ์ด๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ฐ์ฐ ์๋์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ต๋ํ์ผ๋ก ํ์ฉํ ์ ์๋ ํจ์จ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
DP๋ ์๋์ ๊ฐ์ ์กฐ๊ฑด์ด ์ถฉ์กฑ๋๋ฉด ์ ์ฉํ ์ ์์ต๋๋ค.
- problem์ด ๋ ์์ sub-problem๋ค๋ก ์ชผ๊ฐ์ง ์ ์์๋
- sub-problem๋ค์ ์๋ฃจ์ ์ผ๋ก ๋ ํฐ ๊ท๋ชจ์ problem์ ์๋ฃจ์ ์ ๊ตฌํ ์ ์์ ๋
- ์ชผ๊ฐ์ง sub-problem๋ค์ด ๊ฒน์น ๋
์ฆ, ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ๋๋์ด ํ์ด ์ ์ฅ(Memoization) ํจ์ผ๋ก์จ, ํ ๋ฒ ๊ณ์ฐํ ๋ฌธ์ ๋ ๋ค์ ๊ณ์ฐํ์ง ์๋๋ก ํฉ๋๋ค.
Top-Down vs Bottom-up
DP๋ก ํ์ดํ๋ ๋ฐฉ๋ฒ์ ํฌ๊ฒ 2๊ฐ์ง, Top-Down ๋ฐฉ์๊ณผ Bottom-up๋ฐฉ์์ผ๋ก ๋๋ฉ๋๋ค.
Top-Down ๋ฐฉ์
์ฐ๋ฆฌ๋ง๋ก 'ํํฅ์'์ด๋ผ๊ณ ๋ ํ๋ฉฐ ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์์ ๋ฌธ์ ๋ฅผ ํธ์ถํ๋ ๋ฐฉ์์ ๋๋ค.
- ๋ณดํต ์ฌ๊ท ํธ์ถ์ ํตํด ๋ต์ ๊ตฌํจ
- ํจ์ ํธ์ถ์ ํ์๋ฅผ ์ค์ด๊ธฐ ์ํด *๋ฉ๋ชจ์ด์ ์ด์ ๊ธฐ๋ฒ์ด ์ฌ์ฉ๋จ
*๋ฉ๋ชจ์ ์ด์ ๊ธฐ๋ฒ
์ปดํจํฐ ํ๋ก๊ทธ๋จ์ด ๋์ผํ ๊ณ์ฐ์ ๋ฐ๋ณตํด์ผ ํ ๋, ์ด์ ์ ๊ณ์ฐํ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํจ์ผ๋ก์จ ๋์ผํ ๊ณ์ฐ์ ๋ฐ๋ณต ์ํ์ ์ ๊ฑฐํ์ฌ ํ๋๊ทธ๋จ ์คํ ์๋๋ฅผ ๋น ๋ฅด๊ฒ ํ๋ ๊ธฐ์
์๋ฅผ ๋ค์ด dp[n]์ ํผ๋ณด๋์น ์์ด์ ๊ฐ์ ์ ์ฅํจ์ผ๋ก์จ ๋ฉ๋ชจ์ ์ด์ ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
const N = 10;
const dp = Array.from({length: N+1}, () => -1);
const fibonacci = (n) => {
if (n == 0) return 0;
if (n == 1) return 1;
if (dp[n] != -1) return dp[n];
dp[n] = fibonacci(n - 1) + fibonacci(n - 2);
return dp[n];
}
console.log(fibonacci(10)); // 55
Bottom-Up ๋ฐฉ์
์ฐ๋ฆฌ๋ง๋ก '์ํฅ์'์ด๋ผ๊ณ ๋ ํ๋ฉฐ ๊ฐ์ฅ ์์ ๋ฌธ์ ๋ค๋ถํฐ ๋ต์ ์ฐพ์ ๊ฐ๋ฉด์ ๋ง์ง๋ง์๋ ์ ์ฒด ๋ฌธ์ ์ ๋ต์ ๊ตฌํ๋ ๋ฐฉ์์ ๋๋ค.
- ๋ณดํต ๋ฐ๋ณต๋ฌธ์ ์ด์ฉํด ๊ตฌํ
- ์ฌ๊ท ํธ์ถ์ ํ์ง ์์ผ๋ฏ๋ก ์๊ฐ๊ณผ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ์ฉ๋์ด ์๋์ ์ผ๋ก ์ ๋ค๋ ์ด์ ์ด ์์
์๋ฅผ ๋ค์ด ํผ๋ณด๋์น ์์ด์ ๊ฐ์ ๊ตฌํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
const N = 10;
const dp = Array.from({length: N+1}, () => -1);
const fibonacci = (n) => {
dp[0] = 0, dp[1] = 1;
for (let i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
}
fibonacci(10);
console.log(dp);
// [ 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 ]
๋ ๋ฐฉ์์ ๊ตฌํ ๋์ด๋๊ฐ ๋ฌธ์ ๋ง๋ค ๊ต์ฅํ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ DP๋ฌธ์ ์ํฉ์ ๋ฐ๋ผ ๋ฐฉ๋ฒ์ ์ ํํ๊ฒ ๋ฉ๋๋ค.
[์ฐธ๊ณ ]
https://www.youtube.com/watch?v=eJC2oetXaNk
https://velog.io/@chnh506/Top-down-%EB%B0%A9%EC%8B%9D%EA%B3%BC-Bottom-up-%EB%B0%A9%EC%8B%9D