2021. 11. 27. 10:30ใProgramming/Algorithms
๋์ ๊ณํ๋ฒ ์ค ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ ์ฉํ๋ ๋ฌธ์ ๋ค์ด ์ฐธ ๋ง์๋๋ฐ,
๋ฌด์จ ์๋ฆฌ์ธ์ง ์ ๋๋ก ์ดํดํ์ง ๋ชปํ๋ค.
๊ทธ๋์ ์ค๋ ๊ฐ์ก๊ณ ์กฐ์ฌํด๋ณด์๋ค. ^_^
1. ๋์ ๊ณํ๋ฒ์ด๋?
๋์ ๊ณํ๋ฒ (dynamic programming): ์ฒ์ ์ฃผ์ด์ง ๋ฌธ์ ๋ค์ ๋ถํ ํ๊ณ , ์ด๋ก๋ถํฐ ๋ณธ ๋ฌธ์ ์ ๊ดํ ๋ต์ ๋์ถํ๋ ์ ๊ทผ ๋ฐฉ๋ฒ์ด๋ค. ํนํ ๋ถ๋ถ ๋ฌธ์ ๋ค์ ์๊ฐ ๊ธฐํ๊ธ์์ ์ผ๋ก ์ฆ๊ฐํ ๋ ์ ์ฉํ๋ค. ๋์ ๊ณํ๋ฒ์ ์ฌ๋ฌ ๋ฌธ์ ํด๊ฒฐ์ ์ฌ์ฉ๋๋ ๋ถ๋ถ ๋ฌธ์ ์ ๋ํ ๊ฒฐ๊ณผ๋ฅผ ์ฌ๋ฌ๋ฒ ๊ณ์ฐํ๋ ๋์ , ํ ๋ฒ๋ง ๊ณ์ฐํ๊ณ ์ด๋ฅผ ์ฌํ์ฉํ์ฌ ์๋๋ฅผ ํฅ์์ํจ๋ค๋ ์ ์์ ๋ถํ ์ ๋ณต๋ฒ๊ณผ ์ฐจ์ด๊ฐ ์๋ค. ์ด๋ฅผ ์ํ์ฌ ๊ฐ ๋ฌธ์ ์ ๋ต์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํด์ผ ํ๋๋ฐ, ์ด๋ฏธ ๊ณ์ฐ๋ ๊ฐ์ ์ ์ฅํด๋๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฅ์๋ฅผ ์บ์(cache)๋ผ๊ณ ํ๋ฉฐ, ๋ ๋ฒ ์ด์ ๊ณ์ฐ๋๋ ๋ถ๋ถ ๋ฌธ์ ๋ฅผ ์ค๋ณต๋๋ ๋ถ๋ถ๋ฌธ์ ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- ๊ฐ ๋ถ๋ถ ๋ฌธ์ ๋ค์ด ์๋ก ์ฐ๊ด์ด ์์ ๋
-> ๋จ์ํ ์ฌ๊ท ํธ์ถ๋ก ๋ฌธ์ ํด๊ฒฐ
-> ๋ถํ ์ ๋ณต๋ฒ
- But ๋๋ ์ง ๋ฌธ์ ๋ค์ด ๊ฐ์ ๋ถ๋ถ ๋ฌธ์ ๋ค์ ์ค๋ณต๋์ด ์์กดํ ๋
-> ๋ถํ ์ ๊น์ด๊ฐ ๊น์ด์ง์๋ก ์ค๋ณต ํ์ ์ง์์ ์ฆ๊ฐ (์กฐํฉ ํญ๋ฐ)
-> ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ์ฌ ๊ณ ์๋ ์๊ณ ๋ฆฌ์ฆ : ๋์ ๊ณํ๋ฒ
2. ๋ฉ๋ชจ์ด์ ์ด์ (memoization)์ด๋?
- ํจ์์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๋ ์ฅ์๋ฅผ ๋ง๋ จํด๋๊ณ , ํ ๋ฒ ๊ณ์ฐํ ๊ฐ์ ์ ์ฅํ์ฌ ์ฌํ์ฉํ๋ ์ต์ ํ ๊ธฐ๋ฒ
- ๋์ผํ ๊ณ์ฐ์ ๋ฐ๋ณตํด์ผ ํ ๊ฒฝ์ฐ, ๋ฉ๋ชจ์ด์ ์ด์ ์ ํตํ์ฌ ์ค๋ณต ๊ณ์ฐ์ ๋ฐฉ์งํ ์ ์๋ค.
- ๋ฉ๋ชจ๋ฆฌ๋ผ๋ ๊ณต๊ฐ ๋น์ฉ์ ํฌ์ ํ์ฌ, ๊ณ์ฐ์ ์์๋๋ ์๊ฐ ๋น์ฉ์ ์ค์ด๋ ๋ฐฉ์์ด๋ค.
3. ๋ฉ๋ชจ์ด์ ์ด์ ์ ํ์ฉ
// ์ฌ๊ท ํธ์ถ์ ํตํ ์ดํญ ๊ณ์์ ๊ณ์ฐ
int bino(int n, int r) {
if (r == 0 || n == r) {
return 1;
// ๊ธฐ์ ์ฌ๋ก
}
else {
return bino(n - 1, r - 1) + bino(n - 1, r);
// ํจ์์ ์ค๋ณต ํธ์ถ ํ์๋ n๊ณผ r์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ๊ธฐํ๊ธ์์ ์ผ๋ก ์ฆ๊ฐ
}
}
// ๋ฉ๋ชจ์ด์ ์ด์
์ ํตํ ์ดํญ ๊ณ์์ ๊ณ์ฐ
int cache[30][30]; // -1๋ก ์ด๊ธฐํ
int bino2(int n, int r) {
if (r == 0 || n == r) {
return 1;
// ๊ธฐ์ ์ฌ๋ก
}
if (cache[n][r] != -1) {
return cache[n][r];
// -1์ด ์๋๋ผ๋ฉด ์ด๋ฏธ ๊ณ์ฐ๋ ๊ฐ์ด ์๋ค๋ ๋ป!
}
else {
cache[n][r] = bino2(n - 1, r - 1) + bino2(n - 1, r);
return cache[n][r];
}
}
// ๊ท์ฝ๊ณ ์ฌ๋ฏธ์๋ ๋ฌํฝ์ด ๋ฌธ์ ์์๋ cache๋ฅผ ์ฐพ์๋ณผ ์ ์๋ค! :)
int n = 0;
int m = 0;
int cache [MAX_N] [2 * MAX_N + 1];
int climb(int days, int climbed) {
if (days == m) {
return climbed >= n ? 1 : 0;
}
int& ret = cache[days][climbed];
if (ret != -1) {
return ret;
}
ret = climb(days + 1, climbed + 1) + climb(days + 1, climbed + 2);
return ret;
}
// ์ฅ๋ง๊ฐ ์ฐพ์์๋ค!
// ์ฌ๋ฆ ์ฅ๋ง๋ก ์ธํด ๋น๊ฐ ์ฌ ํ๋ฅ ์ด 50% -> 75%
int climb2(int days, int climbed) {
if (days == m) {
return climbed >= n ? 1 : 0;
}
int& ret = cache[days][climbed];
if (ret != -1) {
return ret;
}
ret = 0.25*climb2(days + 1, climbed + 1) + 0.75*climb2(days + 1, climbed + 2);
return ret; // ๊ฒฝ์ฐ์ ์๊ฐ ์๋, ํ๋ฅ ์ return ํ๋ค.
}
4. ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ (optimal substructure)
- ํจ์จ์ ์ธ ๋์ ๊ณํ๋ฒ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ๊ธฐ ์ํ์ฌ ์์ฃผ ์ค์ํ ์กฐ๊ฑด์ด๋ค.
- ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ๊ฐ ์ฑ๋ฆฝํ ๊ฒฝ์ฐ, ๊ฐ ๋ถ๋ถ ๋ฌธ์ ์ ์ต์ ํด๋ง์ผ๋ก ์ ์ฒด ๋ฌธ์ ์ ์ต์ ํด๋ฅผ ์ฝ๊ฒ ๊ตฌํ ์ ์๋ค.
- ์ง๊ธ๊น์ง์ ์ ํ๊ณผ ๋ฌด๊ดํ๊ฒ ๊ฐ ๋ถ๋ถ ๋ฌธ์ ๋ฅผ ์ต์ ์ผ๋ก ํ๊ธฐ๋ง ํ๋ฉด, ์ ์ฒด ๋ฌธ์ ์ ์ต์ ํด๋ ์ ์ ์๋ค.
- ๋ง์ ๋ฌธ์ ์์ ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ๋ ์ง๊ด์ ์ผ๋ก ์ดํดํ ์ ์๋ค. ์ฆ๋ช ์ด ํ์ํ ๊ฒฝ์ฐ ๊ท๋ฅ๋ฒ, ํน์ ๋์ฐ๋ฅผ ํ์ฉํ๋ค.
ex) ์์ธ์์ ๋ถ์ฐ์ผ๋ก ๊ฐ๋ ์ต๋จ ๊ฒฝ๋ก๊ฐ ๋์ ์ ์ง๋๋ค.
ํด๋น ๊ฒฝ๋ก๋ฅผ (์์ธ, ๋์ ), (๋์ , ๋ถ์ฐ)์ผ๋ก ๋๋ ๋, ๊ฐ๊ฐ์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ป์ผ๋ฉด ์ ์ฒด ๊ฒฝ๋ก์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ ์ ์๋ค.
์ด์ ๊ฐ์ด ๊ฐ ๋ถ๋ถ ๋ฌธ์ ์ ์ต์ ํด๊ฐ ์ ์ฒด ๋ฌธ์ ์ ์ต์ฒํด๋ก ์ด์ด์ง ๋, ์ด๋ฅผ ์ต์ ๋ถ๋ถ ๊ตฌ์กฐ๋ฅผ ๊ฐ๋๋ค๊ณ ํ๋ค.
5. ์ต์ ํ ๋ฌธ์ ๋์ ๊ณํ๋ฒ TIP
1. ๋ชจ๋ ๋ต์ ๋ง๋ค์ด๋ณด๊ณ , ๊ทธ ์ค์์ ์ต์ ํด๋ฅผ ๋ฐํํ๋ ์์ ํ์ ์๊ณ ๋ฆฌ์ฆ์ ์ค๊ณํ๋ค.
2. ์ ์ฒด ๋ฌธ์ ์ ์ต์ ํด๋ฅผ ๋ฐํํ์ง ์๊ณ , ์์ผ๋ก ๋จ์ ์ ํ๋ค์ ํด๋นํ๋ ๋ต์ ๋ฐํํ๋๋ก ๋ถ๋ถ ๋ฌธ์ ์ ์ ์๋ฅผ ๋ณํํ๋ค.
3. ์ฌ๊ท ํธ์ถ์ ์ ๋ ฅ์ ์ด์ ์ ์ ํ์ ๊ด๋ จ๋ ์ ๋ณด๊ฐ ์๋ค๋ฉด, ๊ผญ ํ์ํ ๊ฒ๋ง ๋จ๊ธฐ๊ณ ์ค์ธ๋ค.
- ๊ฐ๋ฅํ ํ ์ค๋ณต๋๋ ๋ถ๋ถ ๋ฌธ์ ๋ฅผ ๋ง์ด ๋ง๋ ๋ค. ์ ๋ ฅ์ ์ข ๋ฅ๊ฐ ์ค์ด๋ค์๋ก ๋ ๋ง์ ๋ถ๋ถ ๋ฌธ์ ๊ฐ ์ค๋ณต๋๊ณ , ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ต๋ํ ํจ์จ์ ์ผ๋ก ์ ์ฉํ ์ ์๋ค.
4. ์ ๋ ฅ์ด ๋ฐฐ์ด์ด๊ฑฐ๋ ๋ฌธ์์ด์ด๋ผ๋ฉด, ์ ์ ํ ๋ณํ์ ํตํ์ฌ ๋ฉ๋ชจ์ด์ ์ด์ ํ ์ ์๋๋ก ํ๋ค.
5. ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ ์ฉํ๋ค.
์ถ์ฒ:
- ํ๋ก๊ทธ๋๋ฐ ๋ํ์์ ๋ฐฐ์ฐ๋ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํด๊ฒฐ ์ ๋ต (๊ตฌ์ข ๋ง)
- https://namu.wiki/w/%EB%A9%94%EB%AA%A8%EC%9D%B4%EC%A0%9C%EC%9D%B4%EC%85%98
- https://ssminji.github.io/2020/02/05/the-cake-thief/
'Programming > Algorithms' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด] STRJOIN ๋ฌธ์์ด ํฉ์น๊ธฐ / ํํ๋ง ์ฝ๋ (0) | 2021.11.30 |
---|---|
[์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด] NUMBERGAME : ์ซ์ ๊ฒ์ (0) | 2021.11.28 |
[์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด] TICTACTOE game (0) | 2021.11.28 |
[์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด] ZIMBABWE (0) | 2021.11.27 |