ALGORITHM_Dynamic Programming
๐ ALGORITHM
๐ DP ( Dynamic )
ํผ๋ณด๋์น ์์ด ์ด๋ ๋ฌด์์ธ๊ฐ ?
- 0 ( 0ํญ ) ๊ณผ 1 ( 1ํญ )๋ก ์์ํ๊ณ ์ด์ ์ ๋ ์ ํฉ์ ๋ค์ ํญ์ผ๋ก ํ๋ ์์ด
-
i ๋ฒ์งธ ํผ๋ณด๋์น ์์ด์ ๊ณ์ฐํ๋ ๋ฐฉ๋ฒ
F(i) = F(i-1) + F(i-2); - ์ฌ๊ท๋ก ํผ๋ณด๋์น ์์ด ๊ตฌํ๋ ๋ฐฉ๋ฒ
( ์ฌ๊ท๋ ํจ์, ๋ฉ์๋(์ ์)์ ์ญํ ์ ๋ช ํํ !! )
static void fibo(int n){ if(n < 2) return n; else{ return fibo(n-1)+ fibo(n-2); } }
-> ํฐ ๋ฌธ์ ์ ์ด ์๋ค.
๊ทธ๊ฒ์ ์์ฒญ๋ ์ค๋ณต ํธ์ถ์ด ์กด์ฌํ๋ค๋ ๊ฒ์ด๋ค.
ํผ๋ณด๋์น ์์ด์ Call Tree ( ์ํ ๊ณต๊ฐ ํธ๋ฆฌ )
์ด ์ฌ์ง์ ์๊ฐ ์ ์ด์ ์ค๋ณต์ด ์ ์ด ๋ณด์ด์ง๋ง ์๊ฐ ํฌ๋ค๋ฉด ์ค๋ณต์ ๋น๋๋ ๋ ๋ง์์ง ๊ฒ์ด๋ค.
-ยป ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๋ฐฉ๋ฒ์ ๋ฉ๋ชจ์ด์ ์ด์ !!
๋ฉ๋ชจ์ด์ ์ด์ ( memoization ) ์ด๋ ๋ฌด์์ธ๊ฐ?
-
๋ฉ๋ชจ์ด์ ์ด์ ( memoization )์ ์ปดํจํฐ ํ๋ก๊ทธ๋จ์ ์คํํ ๋ ์ด์ ์ ๊ณ์ฐํ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํด์ ๋งค๋ฒ ๋ค์ ๊ณ์ฐํ์ง ์๋๋ก ํ์ฌ ์ ์ฒด์ ์ธ ์คํ ์๋๋ฅผ ๋น ๋ฅด๊ฒ ํ๋ ๊ธฐ์ ์ด๋ค. ๋์ ๊ณํ๋ฒ์ ํต์ฌ์ด ๋๋ ๊ธฐ์ ์ด๋ค.
-
๋ฉ๋ชจ์ด์ ์ด์ ์ DP๊ฐ ์๋๊ณ ๋ค๋ฅธ ํ๋์ ๊ธฐ์ ์ด๋ค.
-
๋ฉ๋ชจ๋ฆฌ์ ์ด์ ์ด ์๋๋ค !! ๊ธฐ์ตํ๊ธฐ ์๊ธฐํ๊ธฐ๊ฐ ์๋๋ผ ๋ฉ๋ชจ๋ฆฌ์ ๋ฃ๊ธฐ๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
-
ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ์์ fibo1(n)์ ๊ฐ์ ๊ณ์ฐํ์๋ง์ ์ ์ฅํ๋ฉด ์คํ์๊ฐ์ O(n)์ผ๋ก ์ค์ผ ์ ์๋ค.
-
๋ฉ๋ชจ์ด์ ์ด์ ๋ก ํผ๋ณด๋์น ์์ด ๊ตฌํ๋ ๋ฐฉ๋ฒ
static int fibo1(int n){
if(n >= 2 && memo[n] == 0){
memo[n] = fibo[n-1] + fibo[n-2];
}
return memo[n];
}
- ๊ณ ๋ คํด์ผํ ์
- ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ํ์ํ๋ค
- ์ฌ๊ท ํจ์ ํธ์ถ๋ก ์ธํ ์์คํ ํธ์ถ ์คํ์ ์ฌ์ฉํ๊ฒ ๋๊ณ ์คํ ์๋ ์ ํ ๋๋ ์ค๋ฒํ๋ก์ฐ๊ฐ ๋ฐ์ํ ์ ์๋ค.
-
์์ํจ์ ์ผ ๋๋ง ๋ฉ๋ชจ์ด์ ์ด์
์ ์ฌ์ฉํ ์ ์๋ค.
- ์์ํจ์๋ ๊ฐ์ ๊ฐ์ ๋ฃ์ ๋ ๊ฐ์ ๊ฐ๋ง์ ์ถ๋ ฅํ๋ ๊ฒ ( ๋ฃ์๋๋ง๋ค ๊ฐ์ด ๋ณํ๋ฉด ์๋๋ค )
- ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ ๋ dp ์ ํ์์ผ๋ก ๋ชปํ๊ฒ ๋ ๊ฒฝ์ฐ ๋ฉ๋ชจ์ด์ ์ด์ ํด๋ ํ๋ฆฌ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
- ์ผ๋ฐ ์ฌ๊ท -> ์ฌ๊ท ( ๋ฉ๋ชจ์ด์ ์ด์ , ํํฅ์ ) -> DP ( ๋ฉ๋ชจ์ด์ ์ด์ , ์ํฅ์ ( ์ ํ์, for ) ) -> ์ํ์ผ๋ฐํญ
๋์ ๊ณํ๋ฒ ( Dynamic Programming ) ์ด๋ ๋ฌด์์ธ๊ฐ?
-
๋์ ๊ณํ๋ฒ ( Dynamic Programming ) ์ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๊ฐ์ด ์ต์ ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
-
๋์ ๊ณํ๋ฒ์ ๋จผ์ ์์ ๋ถ๋ถ ๋ฌธ์ ๋ค์ ํด๋ค์ ๊ตฌํ๊ณ ์ด๋ค์ ์ด์ฉํ์ฌ ๋ณด๋ค ํฐ ํฌ๊ธฐ์ ๋ถ๋ถ ๋ฌธ์ ๋ค์ ํด๊ฒฐํ์ฌ ์ต์ข ์ ์ผ๋ก ์๋ ์ฃผ์ด์ง ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์๊ณ ๋ฆฌ์ฆ ์ค๊ณ ๊ธฐ๋ฒ์ด๋ค.
๋์ ๊ณํ๋ฒ ( Dynamic Programming ) ์ด ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ 2๊ฐ์ง ์๊ฑด
- ์ค๋ณต ๋ถ๋ถ๋ฌธ์ ๊ตฌ์กฐ ( Overlapping subproblems)
- DP ๋ ํฐ ๋ฌธ์ ๋ฅผ ์ด๋ฃจ๋ ์์ ๋ฌธ์ ๋ค์ ๋จผ์ ํด๊ฒฐํ๊ณ ์์ ๋ฌธ์ ๋ค์ ์ต์ ํด๋ฅผ ์ด์ฉํ์ฌ ์ํ์ ์ผ๋ก ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค. ( ์ํ์ ์ธ ๊ด๊ณ๋ฅผ ๋ช ์์ ์ผ๋ก ํํํ๊ธฐ ์ํด ์ ํ์์ ์ฌ์ฉํ๋ค. )
- DP ๋ ๋ฌธ์ ์ ์ํ์ ์ธ ์ฑ์ง ๋๋ฌธ์ ์ด์ ์ ๊ณ์ฐ๋์ด์ก๋ ์์ ๋ฌธ์ ์ ํด๊ฐ ๋ค๋ฅธ ์ด๋๊ฐ์์ ํ์ํ๊ฒ ๋๋๋ฐ ์ด๋ฅผ ์ํด DP์์๋ ์ด๋ฏธ ํด๊ฒฐ๋ ์์ ๋ฌธ์ ๋ค์ ํด๋ค์ ์ด๋ค ์ ์ฅ ๊ณต๊ฐ์ ์ ์ฅํ๊ฒ ๋๋ค. ๊ทธ๋ ๊ฒ ํด์ ์ค๋ณต๋ ๊ณ์ฐ์ ํผํ๋ค. ( ๋ฉ๋ชจ์ด์ ์ด์ )
- ์ต์ ๋ถ๋ถ๋ฌธ์ ๊ตฌ์กฐ ( Optimal substructure )
- DP๊ฐ ์ต์ ํ์ ๋ํ ๋ชจ๋ ๋ฌธ์ ์ ์ ์ฉ๋๋ ๊ฒ์ ์๋๋ค. ์ฃผ์ด์ง ๋ฌธ์ ๊ฐ ์ต์ ํ์ ์์น์ ๋ง์กฑํด์ผ๋ง ๋์ ๊ณํ๋ฒ์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
- ์ต์ ํ์ ์์น์ด๋ ์ด๋ค ๋ฌธ์ ์ ๋ํ ํด๊ฐ ์ต์ ์ผ ๋ ๊ทธ ํด๋ฅผ ๊ตฌ์ฑํ๋ ์์ ๋ฌธ์ ๋ค๋ ์ญ์ ์ต์ ์ด์ด์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
- ์ต์ ํ ์์น์ด ์ ์ฉ๋์ง ์๋ ์ : ์ต์ฅ ๊ฒฝ๋ก ๋ฌธ์ ( DP ๋ก ํด๊ฒฐํ ์ ์๋ค. )
๋์ ๊ณํ๋ฒ ( Dynamic Programming ) ๊ณผ ๋ถํ ์ ๋ณต ๋น๊ต
- DP
- ๋ถ๋ถ ๋ฌธ์ ๋ค์ด ์ฐ๊ด์ด ์์ผ๋ฉด ์ ์ฉ ๋ถ๊ฐ.
- ๋ชจ๋ ๋ถ๋ถ ๋ฌธ์ ๋ฅผ ํ๋ฒ๋ง ๊ณ์ฐํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ์ฌ ์ฌ์ฉํ๋ค.
- ์ํฅ์ ๋ฐฉ๋ฒ
- ๋ถํ ์ ๋ณต
- ์ฐ๊ด ์๋ ๋ถ๋ถ ๋ฌธ์ ๋ก ๋ถํ ํ๋ค.
- ๋ถ๋ถ๋ฌธ์ ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ํด๊ฒฐํ๋ค.
- ๋ถ๋ถ๋ฌธ์ ์ ํด๋ฅผ ๊ฒฐํฉํ๋ค.
- ํํฅ์ ๋ฐฉ๋ฒ
- ์ ) ๋ณํฉ ์ ๋ ฌ, ํต ์ ๋ ฌ
๋์ ๊ณํ๋ฒ ( Dynamic Programming ) ์ ์ฉ ์ ๊ทผ ๋ฐฉ๋ฒ
- ์ต์ ํด ๊ตฌ์กฐ์ ํน์ฑ์ ํ์
ํ๋ผ
- ๋ฌธ์ ๋ฅผ ๋ถ๋ถ ๋ฌธ์ ๋ก ๋๋๋ค.
- ์ต์ ํด์ ๊ฐ์ ์ฌ๊ท์ ์ผ๋ก ์ ์ํ๋ผ
- ๋ถ๋ถ ๋ฌธ์ ์ ์ต์ ํด ๊ฐ์ ๊ธฐ๋ฐํ์ฌ ๋ฌธ์ ์ ์ต์ ํด ๊ฐ์ ์ ์ํ๋ค.
- ์ํฅ์ ๋ฐฉ๋ฒ์ผ๋ก ์ต์ ํด์ ๊ฐ์ ๊ณ์ฐํ๋ผ
- ๊ฐ์ฅ ์์ ๋ถ๋ถ ๋ฌธ์ ๋ถํฐ ํด๋ฅผ ๊ตฌํ ๋ค ํ ์ด๋ธ์ ์ ์ฅํ๋ค. ( ๋ฉ๋ชจ์ด์ ์ด์ )
- ํ ์ด๋ธ์ ์ ์ฅ๋์ด ์๋ ๋ถ๋ถ ๋ฌธ์ ์ ํด๋ฅผ ์ด์ฉํ์ฌ ์ ์ฐจ์ ์ผ๋ก ์์ ๋ถ๋ถ ๋ฌธ์ ์ ์ต์ ํด๋ฅผ ๊ตฌํ๋ค. ( ์ํฅ์ ๋ฐฉ๋ฒ )
ํผ๋ณด๋์น ์ DP ์ ์ฉ
- ํผ๋ณด๋์น ์๋ ๋ถ๋ถ ๋ฌธ์ ์ ๋ต์ผ๋ก๋ถํฐ ๋ณธ ๋ฌธ์ ์ ๋ต์ ์ป์ ์ ์์ผ๋ฏ๋ก ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
- ๋ฌธ์ ๋ฅผ ๋ถ๋ถ ๋ฌธ์ ๋ก ๋ถํ ํ๋ค.
- ์ ํ์์ผ๋ก ์ ์ํ๋ค.
- ๊ฐ์ฅ ์์ ๋ถ๋ถ ๋ฌธ์ ๋ถํฐ ํด๋ฅผ ๊ตฌํ๋ค. ๊ฒฐ๊ณผ๋ ํ
์ด๋ธ์ ์ ์ฅํ๊ณ ํ
์ด๋ธ์ ์ ์ฅ๋ ๋ถ๋ถ ๋ฌธ์ ์ ํด๋ฅผ ์ด์ฉํ์ฌ ์์ ๋ฌธ์ ์ ํด๋ฅผ ๊ตฌํ๋ค.
ํผ๋ณด๋์น DP ์ ์ฉ ์๊ณ ๋ฆฌ์ฆ
static int fibo_dp(int n){
dp[0] = 0;
dp[1] = 1;
for(int i=2; i<N; i++){
dp[i] = dp[i-1] + dp[i-2];
}
return dp[i];
}
ํผ๋ณด๋์น ์ ๊ตฌํ๊ธฐ - DP ์๊ณ ๋ฆฌ์ฆ ๋ถ์
- DP ์๊ณ ๋ฆฌ์ฆ์ด ์ํ์๋๊ฐ ๋ ๋น ๋ฅด๋ค
- ์ด์
- ์ฌ๊ท ์๊ณ ๋ฆฌ์ฆ๊ณผ๋ ๋ฌ๋ฆฌ ์ค๋ณต ๊ณ์ฐ์ด ์๋ค
- ๋ํ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ํจ์ ํธ์ถ์ด ๋ฐ์ํ์ง ์๋๋ค.
- ๊ณ์ฐํ๋ ํญ์ ์ด ๊ฐ์
- n+1 ๊ฐ์์ ํญ ๊ณ์ฐ
- ์ฆ fibo[0] ~ fibo[n] ๊น์ง ๋จ ํ๋ฒ์ฉ๋ง ๊ณ์ฐ