โถ DP(Dynamic Programming)?
: ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ๋๋ ์ ํธ๋ ์๊ณ ๋ฆฌ์ฆ.
: ๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋น์ท. ๋ถํ ์ ๋ณต์ ์์ ๋ฌธ์ ๊ฐ ํ ๋ฒ์ฉ ๋์ค์ง๋ง, DP๋ ์์ ๋ฌธ์ ๊ฐ ์ฌ๋ฌ๋ฒ ๋ฐ๋ณต๋์ด ๋์จ๋ค๋ ์ฐจ์ด๊ฐ ์๋ค.
[DP์ ํน์ง 2๊ฐ์ง]
1) Overlapping Subproblem: ๋ถ๋ถ ๋ฌธ์ ๊ฐ ๊ฒน์น๋ค.
2) Optimal Substructure: ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ค.
* Overlapping Subproblem?
Overlapping Subproblem์ ๋ํ์ ์ธ ์๋ก ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ ๋ค์ด๋ณด์.
ํผ๋ณด๋์น ์๋ ๋ค์๊ณผ ๊ฐ์ด ํํํ ์ ์๋ค.
F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2(n>=2) => 0, 1, 1, 2, 3, 5, 8, 13, ...
์์ ์กฐ๊ฑด์ ์ดํดํ๋ค๋ฉด ์๋ ๋ฌธ์ ๋ฅผ ์๊ฐํด๋ณด์.
Q. N๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ผ.
์ด ๋ฌธ์ ๋ ์์ ๋ฌธ์ 2๊ฐ๋ก ๋ํ๋ผ ์ ์๋ค.
์ฆ, N-1๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ , N-2๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ๋ก ๋ํ๋ผ ์ ์๋ค.
Q. N-1๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ผ.
์ด ๋ฌธ์ ์ญ์, ์์ ๋ฌธ์ 2๊ฐ๋ก ๋ํ๋ผ ์ ์๋๋ฐ,
N-2๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ N-3๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ๋ก ๋ํ๋ผ ์ ์๋ค.
Q. N-2๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ผ.
์ด ๋ฌธ์ ์ ์์ ๋ฌธ์ ๋ N-3 ๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ , N-4๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ผ ๊ฒ์ด๋ค.
์ ๋ฌธ์ ๋ค์ ๋ณด๋ฉด ์์๋ฌธ์ ๋ค์ธ N-2๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ N-3๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ๊ฐ ๋ฐ๋ณต๋๋ค.
์ด๋ ๊ฒ Overlapping Subproblem๋ ํฐ ๋ฌธ์ ์ ์์ ๋ฌธ์ ๋ฅผ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ํ ์ ์๊ณ
๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ์ชผ๊ฐค ์ ์๋ค๋ ํน์ง์ ๊ฐ๋๋ค. == ๋ฌธ์ ๊ฐ ๊ฒน์น๋ค.
* Optimal Substructure?
: ๋ฌธ์ ์ ์ ๋ต์ ์์ ๋ฌธ์ ์ ์ ๋ต์์ ๊ตฌํ ์ ์๋ ๊ตฌ์กฐ
Optimal Substructure์ ์์)
์์ธ์์ ๋ถ์ฐ์ ๊ฐ์ฅ ๋น ๋ฅธ ๊ธธ์ด ๋์ ๊ณผ ๋๊ตฌ๋ฅผ ์์๋๋ก ๊ฑฐ์ณ์ผ ํ๋ค๋ฉด(์์ธ->๋์ ->๋๊ตฌ->๋ถ์ฐ)
๋์ ์์ ๋ถ์ฐ์ ๊ฐ๋ ๊ฐ์ฅ ๋น ๋ฅธ ๊ธธ์ ๋๊ตฌ๋ฅผ ๊ฑฐ์ณ์ผ ํ๋ค.(๋์ ->๋๊ตฌ->๋ถ์ฐ)
์์์ ๋ณธ ํผ๋ณด๋์น ์์ด๋ ์์ ๋ฌธ์ ์ ์ ๋ต์ ํฉํ๋ ๊ฒ์ผ๋ก ๊ตฌํ ์ ์๋ค.(Fn = Fn-1 + Fn-2)
Optimal Substructure์ ๋ง์กฑํ๋ค๋ฉด, ๋ฌธ์ ์ ํฌ๊ธฐ์ ์๊ด์์ด ์ด๋ค ํ ๋ฌธ์ ์ ์ ๋ต์ ์ผ์ ํ๋ค.
์๋ฅผ ๋ค์ด,
10๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ฉด์ ๊ตฌํ 4๋ฒ์งธ ํผ๋ณด๋์น ์,
9๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ฉด์ ๊ตฌํ 4๋ฒ์งธ ํผ๋ณด๋์น ์,
8๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ฉด์ ๊ตฌํ 4๋ฒ์งธ ํผ๋ณด๋์น ์,
...
4๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ฉด์ ๊ตฌํ 4๋ฒ์งธ ํผ๋ณด๋์น ์๊น์ง
4๋ฒ์งธ ํผ๋ณด๋์น ์๋ ํญ์ ๊ฐ์ ์ ๋ฐ์ ์๋ค.
โถ ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ๋ฌธ์ ๋ฅผ ์ ๋ฆฌํด๋ณด์๋ฉด,
1) ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์์ ๊ฐ ๋ฌธ์ ๋ ํ ๋ฒ๋ง ํ์ด์ผ ํ๋ค.
2) Optimal Substructure๋ฅผ ๋ง์กฑํ๊ธฐ ๋๋ฌธ์, ๊ฐ์ ๋ฌธ์ ๋ ๊ตฌํ ๋๋ง๋ค ์ ๋ต์ด ๊ฐ๋ค.
3) ๋ฐ๋ผ์ ์ ๋ต์ ํ ๋ฒ ๊ตฌํ์ผ๋ฉด, ์ ๋ต์ ์ด๋๊ฐ์ ๋ฉ๋ชจํด๋๋๋ค.
4) ์ด๋ฐ ๋ฉ๋ชจํ๋ ๊ฒ์ ์ฝ๋์ ๊ตฌํ์์๋ ๋ฐฐ์ด์ ์ ์ฅํ๋ ๊ฒ์ผ๋ก ํ ์ ์๋ค.
5) ๋ฉ๋ชจ๋ฅผ ํ๋ค๊ณ ํด์ ์์ด๋ก Memorization์ด๋ผ๊ณ ํ๋ค.
์์์ ์ค๋ช ํ ํผ๋ณด๋์น ์๋ฅผ ๋ค์ด๋๋ฏน ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ์ด๋ณด์.
๊ทธ๋ฅ ์ฌ๊ท๋ก ํ์์ ๋,
int fibonacci(int n){
if(n <= 1){
return n;
} else{
return fibonacci(n-1) + fibonacci(n-2);
}
}
}
memorization์ ์ด์ฉํ DP๋ก ํ์์ ๋,
int memo[100];
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];
}
}
์ฌ๋ฌ๋ฒ ํ ๋๋ ์ ์ฅ๋ ๊ฐ์ ๋ถ๋ฌ์ค๊ธฐ๋ง ํ๋ฉด ๋๋ค.
๊ฐ๊ฐ์ด O(1)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ฏ๋ก ์ ์ฒด๋ O(n)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ๋๋ค.
โถ ๋ค์ด๋๋ฏน์ ํธ๋ 2๊ฐ์ง ๋ฐฉ๋ฒ
1) Top-down: ์ฌ๊ทํจ์ ์ด์ฉ
: ํฐ ๋ฌธ์ ๋ฅผ ์ ์ ์ชผ๊ฐ๋ฉด์ ์์๋ฌธ์ ๋ก ํธ๋ ๊ฒ
2) Bottom-up: for๋ฌธ ์ด์ฉ
: ์์๋ฌธ์ ๊ฐ ์ ์ ํฉ์ณ์ง๋ฉด์ ์๋ ๋ฌธ์ ๋ฅผ ํ๊ฒ ํ๋ ๊ฒ
Top-down์ ์์์ ๋ดค์ผ๋ Bottom-up ๋ฐฉ๋ฒ์ ๋ ์์ธํ ์ดํด๋ณด์.
* Bottom-up
1) ๋ฌธ์ ๋ฅผ ํฌ๊ธฐ๊ฐ ์์ ๋ฌธ์ ๋ถํฐ ์ฐจ๋ก๋ก ํผ๋ค.
2) ๋ฌธ์ ์ ํฌ๊ธฐ๋ฅผ ์กฐ๊ธ์ฉ ํฌ๊ฒ ๋ง๋ค๋ฉด์ ๋ฌธ์ ๋ฅผ ์ ์ ํผ๋ค.
3) ์์ ๋ฌธ์ ๋ฅผ ํ๋ฉด์ ์๊ธฐ ๋๋ฌธ์, ํฐ ๋ฌธ์ ๋ ํญ์ ํ ์ ์๋ค.
4) ๊ทธ๋ฌ๋ค๋ณด๋ฉด ์ธ์ ๊ฐ ํ์ด์ผํ๋ ๋ฌธ์ ๋ฅผ ํ ์ ์๋ค.
์์์ Top-down(์ฌ๊ท)์ผ๋ก ํผ ๊ฑธ Bottom-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];
}
โถ DP ๋ฌธ์ ํ์ด์ ๋ต
: ์ ํ์ ์ธ์ฐ๋ ๊ฒ์ด ๊ด๊ฑด์ด๋ค.
ํผ๋ณด๋์น ์์ด์์ ๋ดค๋์ DP๋ฌธ์ ๋ Fn = Fn-1 + Fn-2 ๊ฐ์ ์ ํ์์ ์ธ์ธ ์ ์์ด์ผ ํ๋ค.
๊ทธ๋ผ ์ ํ์์ ์ด๋ป๊ฒ ๊ตฌํ๋ ๊ฒ์ผ๊น?
๋จผ์ , ์ ํ์์ ์ ์๋ฅผ ์ธ์์ผ ํ๋ค.
1. ์ ํ์์ ์ ์๋ฅผ ๊ธ๋ก ์ ์ด๋ณด๊ณ , ์์ผ๋ก ๋์ถฉ ํํํด๋ณธ๋ค.
: ์ ํ์์ ํตํด N๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํด์ผ ํ๋ค.
: D[N] =
2. ๋ฌธ์ ๋ฅผ ์์๋ฌธ์ ๋ก ๋๋ ์ผ ํ๋ค.
์์๋ฌธ์ ๋ ์ด๋ป๊ฒ ๋ฌธ์ ๋ฅผ ์๊ฒ ๋ง๋ค์ง ๊ธ๋ก ์ ์ด๋ณด๊ณ ์์ผ๋ก ํํํ๋ค.
: N๋ฒ์งธ ํผ๋ณด๋์น ์๋ N-1๋ฒ์งธ ํผ๋ณด๋์น ์ + N-2๋ฒ์งธ ํผ๋ณด๋์น ์์ด๋ค.
: D[N] = D[N-1] + D[N-2] ← ์์ฑ
์ ์์๋ฟ์ผ๋ฏ๋ก ๋ฌธ์ ๋ฅผ ํ๋ฉด์ ์ตํ๋ณด์...
์ถ์ฒ: BOJ ์จ๋ผ์ธ ๊ฐ์(์๊ณ ๋ฆฌ์ฆ ๊ธฐ์ด)
'๐ Coding Test Study' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C++][๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ] ๊ตฌํ ๋ฐฉ๋ฒ (0) | 2021.07.29 |
---|---|
C++ ๋ฌธ์์ด ๋ค๋ฃจ๊ธฐ (0) | 2021.05.20 |
[Algorithm&์๋ฃ๊ตฌ์กฐ] BFS/DFS? (0) | 2021.04.13 |
[์๋ฃ๊ตฌ์กฐ&์๊ณ ๋ฆฌ์ฆ] ๊ทธ๋ํ? (0) | 2021.04.13 |
[Algorithm] ๋ธ๋ฃจํธ ํฌ์ค(Brute Force) (0) | 2021.03.01 |