* DP(Dynamic Programming)๋ ?
: ํฐ ๋ฌธ์ ๋ฅผ ์์๋ฌธ์ ๋ก ๋๋๊ณ ์์๋ฌธ์ ๋ก ํฐ๋ฌธ์ ๋ฅผ ํธ๋ ๋ฐฉ๋ฒ. ์์๋ฌธ์ ๊ฐ ์ค๋ณต๋๋ค.
(vs ๋ถํ ์ ๋ณต: ๋ถํ ์ ๋ณต๊ณผ ๋น์ทํ๋ฐ ๋ถํ ์ ๋ณต์ ์์๋ฌธ์ ๊ฐ ์ค๋ณต๋์ง ์๋๋ค.)
* DP ์ ํน์ง
1) Overlapping Subproblem: ๋ถ๋ถ๋ฌธ์ (์์๋ฌธ์ )๊ฐ ๊ฒน์น๋ค.
2) Optimal Substructure: ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ. ๋ฌธ์ ์ ์ ๋ต์ ์์ ๋ฌธ์ ์ ์ ๋ต์์ ๊ตฌํ ์ ์๋ค.
์ ๋ต์ ์์ ๋ฌธ์ ์ ์ ๋ต์ ํญ์ ๊ฐ๋ค.
* DP ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ ์ ์๋ ๋ํ์ ์ธ ์
: ํผ๋ณด๋์น ์ !
0 1 1 2 3 5 8 13 21 34 55 89 ...
F0 = 0
F1 = 1 ... Fn = Fn-1 + Fn-2(n ≥ 2) |
Fn ์ด๋ผ๋ ํฐ๋ฌธ์ ๊ฐ์ Fn-1 ๊ณผ Fn-2 ์ ์์ ํฉ์ผ๋ก ๊ตฌํ ์ ์๋ค.
์ฆ, N๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ๋ N-1 ๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ N-2 ๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ๋ก ๋๋ ์ ์๋ค.(Optimal Substructure)
N-1 ๋ฒ์งธ ํผ๋ณด๋์น ์๋ ์ด๋ ํ ๊น?
N-2 ๋ฒ์งธ ํผ๋ณด๋์น ์์ N-3 ๋ฒ์งธ ํผ๋ณด๋์น ์์ ํฉ์ผ๋ก ๊ตฌํ ์ ์๋ค.
์ฆ, N๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ ๋๋ N-1 ๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ ๋๋ N-2 ๋ฒ์งธ ํผ๋ณด๋์น ์๋ฅผ ์ค๋ณต ์ฌ์ฉํ๋ค.
์์๋ฌธ์ ๊ฐ ๊ฒน์น๋ค.(Overlapping Subproblem)
int fibonacci(int n) {
if(n <= 1){
return n;
} else {
return fibonacci(n-1) + fibonacci(n-2);
}
}
Top-down ๋ฐฉ์์ธ ์ฌ๊ทํจ์๋ก ํผ DP.
n ๋ถํฐ 1๊น์ง ํฐ ๋ฌธ์ ๋ฅผ ์์๋ฌธ์ ๋ก ์ชผ๊ฐ๋ฉฐ ํ์ด๋๊ฐ๋ค.
* DP ํน์ง์ ๋ฐ๋ฅธ ํ์ด ๋ฐฉ๋ฒ
์ ๋ต์ด ๊ตฌํ ๋๋ง๋ค ๊ฐ๊ธฐ ๋๋ฌธ์, ์ ๋ต์ ํ ๋ฒ ๊ตฌํ๋ฉด ๊ทธ ์ ๋ต์ ์ด๋๊ฐ์(ex. ๋ฐฐ์ด) ๋ฉ๋ชจํด๋๋๋ค. (Memoization)
F(5)๋ฅผ ์ฒ์์ ๋ค ์ผ์ชฝ์ฒ๋ผ ๊ตฌํ์ง๋ง, ๋ค์์ F(3)์ ๊ตฌํ ๋๋ ๋ฏธ๋ฆฌ ์ ์ฅํด ๋์ F(3) ๊ฐ์ ๋ฐ๋ก ๋ฐํํ๋ค. (์ค๋ฅธ์ชฝ)
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(N)
* DP๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ
1. Top-down: ์ฌ๊ท. ํฐ ๋ฌธ์ ๋ฅผ ์ชผ๊ฐ๋ฉด์ ์์๋ฌธ์ ๋ก ๋ด๋ ค๊ฐ๋ ๊ฒ.
2. 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];
}
Bottom-up ๋ฐฉ์์ธ for๋ฌธ์ผ๋ก ํผ DP. Top-down ์ ์ ์ฝ๋ ์ฐธ๊ณ .
0 ๋ถํฐ n ๊น์ง ์์ ๋ฌธ์ ๋ก ํฐ ๋ฌธ์ ๋ฅผ ํ์ด๋๊ฐ๋ค.
๋๋ค ์๊ด์๋๋ฐ ์ฌ๊ท๊ฐ ์์ ์์ผ๋ฉด Top-down, for๋ฌธ์ด ํธํ๋ฉด Bottom-up ์ผ๋ก ํ๊ธฐ.
Top-down๋ง์ด๋ Bottom-up์ผ๋ก๋ง ํ ์ ์๋ ๋ฌธ์ ๋ ์๊ธด ํ๋ฐ, ๊ทธ๊ฑด ๋งค์ฐ ์ด๋ ค์ด ๋ฌธ์ ๋ค์ด๋ผ ์ผ๋จ์ DP ๋ฌธ์ ์ ์ต์ํด์ง๋๋ฐ ์ง์คํ๊ธฐ.
* ์ ํ์ ์ธ์ฐ๋ ๋ฒ !
: ํผ๋ณด๋์น ์๋ฅผ ๊ตฌํ๋ ๊ฒ ์ฒ๋ผ ์ ํ์์ด ๊ตฌํ๋ ์์ ์ด ํ์ํ๋ค.
: ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ์๊ฒ ๋ง๋ค ๊ฒ์ธ๊ฐ๋ฅผ ์ฐพ์.
* ์์๋ฌธํญ
'๐ Coding Test Study > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Algorithm] ์ธ๊ทธ๋จผํธ ํธ๋ฆฌ(Segment Tree) (0) | 2024.06.08 |
---|