โ ๋์ ๊ณํ๋ฒ(DP)
1. ๋์ ๊ณํ๋ฒ์ด๋?
- ํ๋์ ํฐ ๋ฌธ์ ๋ฅผ ์ฌ๋ฌ ๊ฐ์ ์์ ๋ฌธ์ ๋ก ๋ถํ ํ์ฌ ํธ๋ ๋ฐฉ๋ฒ
- ์ด๋ฏธ ๊ณ์ฐ๋ ์์ ๋ฌธ์ ์ ๊ฒฐ๊ณผ ๊ฐ์ ๋ณ๋์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ ์ฅํด๋๊ณ ํ์ฉํจ.
- ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ ํ๊ฒ ์ฌ์ฉํ์ฌ ์ํ์๊ฐ ํจ์จ์ฑ์ ๋น์ฝ์ ์ผ๋ก ํฅ์์ํฌ ์ ์์.
๋ต์ ์ฌํ์ฉํ๋ ๊ฒ!
"์ด๋ค ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํด ๊ทธ ๋ฌธ์ ๋ฅผ ๋ ์์ ๋ฌธ์ ์ ์ฐ์ฅ์ ์ผ๋ก ์๊ฐํ๊ณ ,
๊ณผ๊ฑฐ์ ๊ตฌํ ํด๋ฅผ ํ์ฉํ๋" ๋ฐฉ์์ ์๊ณ ๋ฆฌ์ฆ
2. ๋์ ๊ณํ๋ฒ ์ฌ์ฉ ์กฐ๊ฑด
1) ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ๋๋ ์ ์์.
2) ์์ ๋ฌธ์ ์์ ๊ตฌํ ๊ฐ์ด ๊ทธ๊ฒ์ ํฌํจํ๋ ํฐ ๋ฌธ์ ์์๋ ๋์ผํ ๊ฐ์ผ๋ก ์ฌ์ฉ๋จ (ํผ๋ณด๋์น ์์ด)
โ ๋ถํ ์ ๋ณต๋ฒ VS ๋์ ๊ณํ๋ฒ
๊ณตํต์
ํฐ ๋ฌธ์ ๋ฅผ ์ชผ๊ฐ์ ๊ฐ์ฅ ์์ ๋จ์๋ก ๋ถํ ํ๋ค.
์ฐจ์ด์
- ๋ถํ ์ ๋ณต๋ฒ : ๋ถ๋ถ ๋ฌธ์ ๋ ์๋ก ์ค๋ณต๋์ง ์์ (๋ฉ๋ชจ์ด์ ์ด์ ๊ธฐ๋ฒ ์ฌ์ฉ X)
- ๋์ ๊ณํ๋ฒ : ๋ถ๋ถ ๋ฌธ์ ๋ ์ค๋ณต๋์ด ์์ ๋ฌธ์ ํด๊ฒฐ์ ์ฌํ์ฉ๋จ (๋ฉ๋ชจ์ด์ ์ด์ ๊ธฐ๋ฒ ์ฌ์ฉ O)
๐ก ์ฉ์ด์ ๋ฆฌ ๐ก
๋ฉ๋ชจ์ด์ ์ด์ (memoization)
์ปดํจํฐ ํ๋ก๊ทธ๋จ์ด ๋์ผํ ๊ณ์ฐ์ ๋ฐ๋ณตํด์ผ ํ ๋,
์ด์ ์ ๊ณ์ฐํ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํจ์ผ๋ก์จ ๋์ผํ ๊ณ์ฐ์ ๋ฐ๋ณต ์ํ์ ์ ๊ฑฐํ์ฌ
ํ๋ก๊ทธ๋จ ์คํ ์๋๋ฅผ ๋น ๋ฅด๊ฒ ํ๋ ๊ธฐ์ ์ด๋ค.
โ ๋์ ๊ณํ๋ฒ ์ฌ์ฉ ๋ฐฉ๋ฒ
1. ์์ ํ์๋ฒ์ผ๋ก ์ ๊ทผํ๋ค.
2. ๋ฐ๋ณต๋๋ ๋ถ๋ถ ๋ฌธ์ ๋ฅผ ์ฐพ๋๋ค.
3. ๊ธฐ์ ๋จ๊ณ๋ฅผ ์ค์ ํ๋ค.
4. ์ ํ์์ ์ค์ ํ๋ค.
5. ์ค๋ณต๋ ๋ฌธ์ ๋ฅผ ํ๋ฒ๋ง ๊ณ์ฐํ๊ธฐ ์ํด ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ด์ฉํ๋ค.
๐ก ์ฉ์ด์ ๋ฆฌ ๐ก
๊ธฐ์ ๋จ๊ณ : ์ ํ์์ผ๋ก ๋ ์ด์ ๊ณ์ฐํ์ง ๋ชปํ๋ ๋ถ๋ถ
โ ๋์ ๊ณํ๋ฒ ์ฌ์ฉ ์์ (ํผ๋ณด๋์น ์์ด)
1. ์ฌ๊ท๋ก ํด๊ฒฐํ ํผ๋ณด๋์น ์์ด
int fibonacci(unsigned int n)
{
if(n <= 1)
return 1;
else
return fibonacci(n-1)+f(n-2);
}
๐ฅ ๋ฐ๋ณต๋๋ ๊ณ์ฐ์ด ๋ง์
2. ๋์ ๊ณํ๋ฒ (Top-down ๋ฐฉ์) ์ฌ์ฉ
int memo[100]{}; //๋ฉ๋ชจ์ด์ ์ด์
๊ณต๊ฐ. ์ ์ญ ๋ณ์์ด๋ฏ๋ก 0์ผ๋ก ์ด๊ธฐํ
int fibonacci(unsigned int n)
{
if (n<=1) //0๋ฒ์งธ, 1๋ฒ์งธ ํผ๋ณด๋์น ์
return n;
if (memo[n]!=0) //๋ฉ๋ชจ๊ฐ ์๋์ง ํ์ธ(0์ผ๋ก ์ด๊ธฐํ๋์์ผ๋ฏ๋ก 0์ด ์๋๋ผ๋ฉด ๋ฉ๋ชจ๊ฐ ์ฐ์ธ ๊ฒ์)
return memo[n]; //๋ฉ๋ชจ ๋ฆฌํด
memo[n] = fibonacci(n-1) + fibonacci(n-2); //์์ ๋ฌธ์ ๋ก ๋ถํ
return memo[n];
}
3. ๋์ ๊ณํ๋ฒ (Bottom-up ๋ฐฉ์) ์ฌ์ฉ
int dp[50] = { 1,1 };
int fibonacci(int n) {
for (int i = 2; i <= n; i++)
{
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
๐ฅ ์๊ฐ ๋ณต์ก๋ ์ฐจ์ด
1) ์ผ๋ฐ ํผ๋ณด๋์น ์์ด
- ์ฌ๊ท๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋์ด๊ฐ n์ธ ํธ๋ฆฌ๊ฐ 2๊ฐ ์กด์ฌํจ
- ์๊ฐ ๋ณต์ก๋ : O(2^n)
2) DP ํผ๋ณด๋์น ์์ด
- ๋๋ฒ์ฉ ๋ฐ๋ณตํ ํ์๊ฐ ์์
- ์๊ฐ ๋ณต์ก๋ : O(n)
'๐ STUDY > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C / C++] ๋ฐฑ์ค 11651๋ฒ - ์ขํ ์ ๋ ฌํ๊ธฐ 2 (0) | 2022.08.27 |
---|---|
[C / C++] ๋ฐฑ์ค 1003๋ฒ - ํผ๋ณด๋์น ํจ์ (0) | 2022.08.26 |
[C / C++] ๋ฐฑ์ค 10989๋ฒ - ์ ์ ๋ ฌํ๊ธฐ 3 (0) | 2022.08.22 |
[C / C++] ๋ฐฑ์ค 1929๋ฒ - ์์ ๊ตฌํ๊ธฐ / ์๋ผํ ์คํ ๋ค์ค์ ์ฒด (0) | 2022.08.17 |
[C / C++] ๋ฐฑ์ค 11653๋ฒ - ์์ธ์๋ถํด (0) | 2022.08.12 |