๐ป
[์๊ณ ๋ฆฌ์ฆ] ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ - Dynamic Programming ๋ณธ๋ฌธ
[์๊ณ ๋ฆฌ์ฆ] ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ - Dynamic Programming
๋ํจ๋ 2020. 3. 16. 17:28๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ(Dynamic Programming)
=> ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ๋๋์ ํธ๋ ์๊ณ ๋ฆฌ์ฆ
- ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์์ ๊ฐ ๋ฌธ์ ๋ ํ ๋ฒ๋ง ํ์ด์ผ ํ๋ค.
- Optimal Substructure ๋ฅผ ๋ง์กฑํ๊ธฐ ๋๋ฌธ์, ๊ฐ์ ๋ฌธ์ ๋ ๊ตฌํ ๋๋ง๋ค ์ ๋ต์ด ๊ฐ๋ค.
- ๋ฐ๋ผ์, ์ ๋ต์ ํ ๋ฒ ๊ตฌํ์ผ๋ฉด ์ด๋๊ฐ์ ๋ฉ๋ชจํด๋๋๋ค.
- ์ด๋ฐ ๋ฉ๋ชจํ๋ ๊ฒ์ ์ฝ๋์ ๊ตฌํ์์๋ ๋ฐฐ์ด์ ์ ์ฅํ๋ ๊ฒ์ผ๋ก ํ ์ ์๋ค.
- ๋ฉ๋ชจ๋ฅผ ํ๋ค๊ณ ํด์ ์์ด๋ก Memoization ์ด๋ผ๊ณ ํ๋ค.
๋ ๊ฐ์ง ์์ฑ์ ๋ง์กฑํด์ผ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ๋ฌธ์ ๋ฅผ ํ ์ ์๋ค.
1. Overlapping Subproblem
(๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ๋๋ ์ ํธ๋๋ฐ, ์ด๋ ๋ฌธ์ ๋ค๋ผ๋ฆฌ ๊ฒน์ณ์ผํ๋ค.)
- ํฐ ๋ฌธ์ ์ ์์ ๋ฌธ์ ๋ฅผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ํ ์ ์๋ค.
- ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ์ชผ๊ฐค ์ ์๋ค.
์์) ํผ๋ณด๋์น ์
F0 = 1, F1= 1, Fn = Fn-1 + Fn-2 (n>=2)
๋ฌธ์ : N๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์
์์๋ฌธ์ : N-1๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ , N-2๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์
๋ฌธ์ : N-1๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์
์์๋ฌธ์ : N-2๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ , N-3๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์
=> Overlapping Subproblem ์ ๋ง์กฑํ๋ค๋ฉด, ๋ฌธ์ ์ ์ ๋ต์ ์์ ๋ฌธ์ ์ ์ ๋ต์ ํฉํ๋ ๊ฒ์ผ๋ก ๊ตฌํ ์ ์๋ค.
2. Optimal Substructure
- ๋ฌธ์ ์ ์ ๋ต์ ์์ ๋ฌธ์ ์ ์ ๋ต์์ ๊ตฌํ ์ ์๋ค.
์์)
10 ๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ฉด์ ๊ตฌํ 4๋ฒ์งธ ํผ๋ณด๋์น ์
9 ๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ฉด์ ๊ตฌํ 4๋ฒ์งธ ํผ๋ณด๋์น ์
...
5๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ฉด์ ๊ตฌํ 4๋ฒ์งธ ํผ๋ณด๋์น ์
4๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ฉด์ ๊ตฌํ 4๋ฒ์งธ ํผ๋ณด๋์น ์
4๋ฒ์งธ ํผ๋ณด๋์น ์๋ ํญ์ ๊ฐ๋ค.
=> Overlapping Subproblem ์ ๋ง์กฑํ๋ค๋ฉด, ๋ฌธ์ ์ ํฌ๊ธฐ์ ์๊ด์์ด ์ด๋ค ํ ๋ฌธ์ ์ ์ ๋ต์ ํญ์ ์ผ์ ํ๋ค.
ํผ๋ณด๋์น ์์ ๊ตฌํ
int fibonacci(int n){
if(n<=1){
return n;
} else{
return fibonacci(n-1)+fibonacci(n-2);
}
}
์์ ๋ฐฉ์์ ๊ฒน์น๋ ํธ์ถ์ด ์๊ธด๋ค.
int memo[100]; //n๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ๋ฐฐ์ด
int fibonacci(int n){
if(n<=1){
return n;
} else {
if(memo[n] > 0){ //์ด์ ์ ๊ตฌํ ๊ฐ์ด๋ฉด
return memo[n];
}
memo[n] = fibonacci(n-1) + fibonacci(n-2);
return memo[n];
}
}
๋ค์ด๋๋ฏน ๋ฌธ์ ๋ฅผ ํธ๋ 2๊ฐ์ง ๋ฐฉ์์ด ์๋ค.
1. Top-down
- ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ๋๋๋ค.
- ์์ ๋ฌธ์ ๋ฅผ ํผ๋ค.
- ์์ ๋ฌธ์ ๋ฅผ ํ์์ผ๋, ์ด์ ๋ฌธ์ ๋ฅผ ํผ๋ค.
- ์๊ฐ๋ณต์ก๋ = ์ฑ์์ผ ํ๋ ์นธ์ ์ X 1์นธ์ ์ฑ์ธ ๋์ ๋ณต์ก๋ (ํผ๋ณด๋์น ์์ ์๊ฐ ๋ณต์ก๋ = n X O(1) = O(n) )
=> ๋ณดํต ์ฌ๊ท ํธ์ถ์ ์ด์ฉํด์ ๋ฌธ์ ๋ฅผ ํผ๋ค. (์: ์์ ํผ๋ณด๋์น ์ ๊ตฌํ ๋ฐฉ์)
int d[100]; //n๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ๋ฐฐ์ด
int fibonacci(int n){
if(n<=1){
return n;
} else {
if(d[n] > 0){ //์ด์ ์ ๊ตฌํ ๊ฐ์ด๋ฉด
return d[n];
}
d[n] = fibonacci(n-1) + fibonacci(n-2);
return d[n];
}
}
2. Bottm-up
- ๋ฌธ์ ์ ํฌ๊ธฐ๊ฐ ์์ ๋ฌธ์ ๋ถํฐ ์ฐจ๋ก๋๋ก ํผ๋ค.
- ๋ฌธ์ ์ ํฌ๊ธฐ๋ฅผ ์กฐ๊ธ์ฉ ํฌ๊ฒ ๋ง๋ค๋ฉด์ ๋ฌธ์ ๋ฅผ ์ ์ ํผ๋ค.
- ์์ ๋ฌธ์ ๋ฅผ ํ๋ฉด์ ์๊ธฐ ๋๋ฌธ์, ํฐ ๋ฌธ์ ๋ ํญ์ ํ ์ ์๋ค.
- ๊ทธ๋ฌ๋ค๋ณด๋ฉด, ์ธ์ ๊ฐ ํ์ด์ผ ํ๋ ๋ฌธ์ ๋ฅผ ํ ์ ์๋ค.
=> ๋ณดํต for๋ฌธ์ ์ด์ฉํด์ ๋ฌธ์ ๋ฅผ ํผ๋ค.
int d[100];
int fibonacci(int n){
d[0] = 0;
d[1] = 1;
for(int i=2; i<=n; i++) {
d[i] = d[i-1] + d[i-2];
}
return d[n];
}
๋ฌธ์ ํ์ด ์ ๋ต
- ๋ฌธ์ ์์ ๊ตฌํ๋ ค๊ณ ํ๋ ๋ต์ ๋ฌธ์ฅ์ผ๋ก ๋ํ๋ธ๋ค.
- ๋ฌธ์ ๋ฅผ ๋ง์ด ํ์ด๋ณด๋ฉด์ ๊ฐ์ ์ก๋ ๊ฒ์ด ์ค์ํ๋ค.