[Algorithm] ๋ ๋ฐ๋จน๊ธฐ ์๊ณ ๋ฆฌ์ฆ / ๋์ ๊ณํ๋ฒ
๋์ ๊ณํ๋ฒ
๋์ ๊ณํ๋ฒ(Dynamic Programming, DP)์ ๋ณต์กํ ๋ฌธ์ ๋ฅผ ๋ ์์ ํ์ ๋ฌธ์ ๋ก ๋ถํ ํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๋ฉด์ ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ด๋ฅผ ํตํด ๋ฌธ์ ์ ์ฐ์ฐ ์๊ฐ์ ํจ๊ณผ์ ์ผ๋ก ์ค์ผ ์ ์๋ค. ๋์ ๊ณํ๋ฒ์ ์ ์ฉํ๊ธฐ ์ํด์ ๋ค์ ๋ ๊ฐ์ง ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ํ๋ค. ํผ๋ณด๋์น ์์ด์ด ์๋ ๋ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ํ์ ์ธ ์.
- ์ต์ ํ์ ๊ตฌ์กฐ Optimal Substructure
์์ ํ์ ๋ฌธ์ ์ ์ต์ ํด๋ฅผ ์กฐํฉํ์ฌ ์ ์ฒด ๋ฌธ์ ์ ์ต์ ํด๋ฅผ ์ป์ ์ ์๋ค. - ํ์ ๋ฌธ์ ์ค์ฒฉ Overlapping Subproblem
๋์ผํ ํ์ ๋ฌธ์ ๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ๋ฐ์ํ๋ค.
๋์ ๊ณํ๋ฒ์ ์ค๋ณต ๊ณ์ฐ ๋ฐฉ์ง๋ฅผ ์ํด ๋ฉ๋ชจ์ด์ ์ด์ ํน์ ํ๋ทธ๋ ์ด์ ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ค.
๋ฉ๋ชจ์ด์ ์ด์ ์ ์ฌ๊ท ํธ์ถ์ ์ฌ์ฉํ์ฌ ํ์ํ ๋ฌธ์ ๋ง ๊ณ์ฐํ๊ณ , ํ๋ทธ๋ ์ด์ ์ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ์ฌ ๋ฌธ์ ์ ๋ชจ๋ ๊ฐ๋ฅํ ํด๋ฅผ ๊ณ์ฐํ๋ค. ๋ฉ๋ชจ์ด์ ์ด์ ์ ํ์ํ ๋ถ๋ถ๋ง ๊ณ์ฐํ๋ฏ๋ก ๋ ํจ์จ์ ์ผ ์ ์์ง๋ง, ์ฌ๊ท ํธ์ถ๋ก ์ธํด ์คํ ์ค๋ฒํ๋ก์ฐ ์ํ์ด ์๋ค. ํ๋ทธ๋ ์ด์ ์ ๋ชจ๋ ๋ฌธ์ ์ ํด๋ฅผ ๊ณ์ฐํ๋ฏ๋ก ๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง๋ง ์ฌ๊ท ํธ์ถ์ ์ ํ ์์ด ์์ ์ ์ผ๋ก ๋์ํ๋ค.
๋์ ๊ณํ๋ฒ์ ํฌ๊ฒ ํํฅ์, ์ํฅ์ ์ ๊ทผ ๋ฐฉ๋ฒ์ผ๋ก ๋๋๋ค.
Top-Down (ํํฅ์)
์ฃผ์ด์ง ๋ฌธ์ ๋ฅผ ๋ ์์ ํ์ ๋ฌธ์ ๋ก ๋ถํดํ๋ฉด์ ๋ฌธ์ ํด๊ฒฐ — ๋ฉ๋ชจ์ด์ ์ด์ ํ์ฉ
ํํฅ์ ๋์ ๊ณํ๋ฒ์ผ๋ก ํผ๋ณด๋์น ์์ด์ ๊ณ์ฐํ๋ ํจ์ โผ
function fibonacci(n, memo = [0, 1]) {
if (memo[n] !== undefined) return memo[n];
if (n <= 1) return n;
memo[n] = fibonacci(n - 1, memo) + fibonacci(n - 2, memo);
return memo[n];
}
Bottom-Up (์ํฅ์)
์์ ๋ฌธ์ ๋ถํฐ ์์ฐจ์ ์ผ๋ก ํด๊ฒฐํ๋ฉด์ ์ฃผ์ด์ง ๋ฌธ์ ํด๊ฒฐ — ํ๋ทธ๋ ์ด์ ํ์ฉ
์ํฅ์ ๋์ ๊ณํ๋ฒ์ผ๋ก ํผ๋ณด๋์น ์์ด์ ๊ณ์ฐํ๋ ํจ์ โผ
function fibonacci(n) {
const table = [0, 1]; // 0~1๋ฒ์งธ ํผ๋ณด๋์น ์ ๋ฏธ๋ฆฌ ์ค์
for (let i = 2; i <= n; i++) {
table[i] = table[i - 1] + table[i - 2];
}
return table[n];
}
๋ ๋ฐ๋จน๊ธฐ ๋ฌธ์
๊ทธ๋ฆฌ๋ (ํ์๋ฒ)
ํ๋ก๊ทธ๋๋จธ์ค ๋ ๋ฒจ 2์ ๋
๋ฐ๋จน๊ธฐ ๋ฌธ์ ๋ ๊ฐ ํ(row)์์ ์ ํํ ์ ์๋ ๊ฐ์ฅ ํฐ ์ซ์์ ํฉ์ ๋ฐํํด์ผ ํ๋ค. ๋จ, ๊ฐ์ ์ด์ ์ฐ์ํด์ ์ ํํ ์ ์๋ ์กฐ๊ฑด์ด ์๋ค. ์๋ฅผ ๋ค์ด ์ฒซ๋ฒ์งธ ํ์ ๊ฐ์ฅ ํฐ ์ซ์์ธ 5
๋ฅผ ์ ํํ๋ค๋ฉด, ๋ค์ ํ์์ 5
์ ๋์ผํ ์ด(์ธ๋ฑ์ค 3)์ ์๋ 8
์ ์ ํํ ์ ์๋ค.
๊ทธ๋ฆฌ๋(Greedy) ์๊ณ ๋ฆฌ์ฆ์ ํ์ฌ ์ํฉ์์ ์ง์ญ์ ์ผ๋ก ์ต์ ์ ์ ํ์ ํ๋ ๋ฐฉ๋ฒ์ด๋ค. ๋ ๋ฐ๋จน๊ธฐ ๋ฌธ์ ๋ฅผ ๊ทธ๋ฆฌ๋ ๋ฐฉ์์ผ๋ก ์ ๊ทผํ๋ฉด ๊ฐ ํ์์ ์ต๋๊ฐ์ ์ ํํ ์ ์์ง๋ง, ์๋์ ๊ฐ์ ์์์์ ์ต์ ์ ํด๋ฅผ ๋์ถํ์ง ๋ชปํ๋ค.
์ ์์์์ ์ฒซ ๋ฒ์งธ ํ์ 3
, ๋ ๋ฒ์งธ ํ์ 2
, ์ธ ๋ฒ์งธ ํ์ 4
๋ฅผ ์ ํํด์ ์ต์ ์ ํด(๊ฐ์ฅ ํฐ ์ 9
)๋ฅผ ๋์ถํ ์ ์๋ค. ํ์ง๋ง ๊ทธ๋ฆฌ๋ ๋ฐฉ์์ผ๋ก ๊ฐ ํ์ ์ต๋๊ฐ์ ์ ํํ๋ฉด ํฉ์ 7
์ด ๋๋ค(์๋ ์ฐธ๊ณ ). ๋ ๋ฒ์งธ ํ์ ๊ฐ์ฅ ํฐ ์ 3
์ ์ ํํ๊ธฐ ๋๋ฌธ์ ์ธ ๋ฒ์งธ ํ์์ ๋์ผํ ์ด์ ์๋ 4
๋ฅผ ์ ํํ ์ ์๊ฒ ๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ์ด ๋ฌธ์ ๋ฅผ ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์์กดํ๋ฉด ์ต์ ์ ํด๋ฅผ ์ป์ ์ ์๋ค. ๊ฐ ๋จ๊ณ์์ ์ต์ ์ ์ ํ์ ํ์ง๋ง, ๊ทธ ์ ํ์ด ํญ์ ์ ์ฒด ๋ฌธ์ ์ ์ต์ ํด๋ฅผ ๋ณด์ฅํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ๋ ค๋ฉด ์ง์ญ์ ์ผ๋ก ์ต์ ์ด๋ฉด์ ์ ์ญ์ ์ผ๋ก๋ ์ต์ ์ธ ๋ฌธ์ ์ฌ์ผ ํ๋ค.
๋์ ํ๋ก๊ทธ๋๋ฐ
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ๊ฐ ํ์ ์๋ ์ด(column)์ ์ ํํ์ ๋ ์ป์ ์ ์๋ ์ต๋๊ฐ์ ๋ชจ๋ ๊ณ์ฐํด๋ด์ผ ํ๋ค. ๋ ๋ฒ์งธ ํ๋ถํฐ ์์ํ์ฌ ๊ฐ ์ด์ด ์ป์ ์ ์๋ ์ต๋๊ฐ์ ์ ์ฅํด ๋๋ค๋ฉด, ๋ง์ง๋ง ํ์์ ์ต์ ํด๋ฅผ ์ฐพ์๋ผ ์ ์๋ค.
์๋ฅผ ๋ค์ด ๋ ๋ฒ์งธ ํ์ ์ฒซ ๋ฒ์งธ ์ด 2
์, ์ฒซ ๋ฒ์งธ ํ์ ๊ฐ์ฅ ํฐ ์ 3
์ ๋ํ๋ฉด, ํด๋น ์ด์ ์ ํํ์ ๋ ์ป์ ์ ์๋ ์ต๋๊ฐ์ด ๋๋ค. ๋์ผํ ์ด์ ์ฐ์ํด์ ์ ํํ ์ ์์ผ๋ฏ๋ก, ์ด์ ํ์ ๋์ผํ ์ด์ ๊ณ์ฐ์์ ์ ์ธํ๋ค. ์ด๋ฐ ์์ผ๋ก ๋ ๋ฒ์งธ ํ์ ๋ชจ๋ ์ด์ ๋ํ ์ต๋๊ฐ์ ๊ณ์ฐํ๊ณ ์ ์ฅํ๋ค.
๋ง์ฐฌ ๊ฐ์ง๋ก ์ธ ๋ฒ์งธ ํ ์ฒซ ๋ฒ์งธ ์ด์ ์ต๋๊ฐ์, ๋ ๋ฒ์งธ ํ์ ์๋ ๊ฐ์ฅ ํฐ ์๋ฅผ ๋ํด์ ์ป์ ์ ์๋ค. ์ด ๊ณผ์ ์ ๋ฐ๋ณตํด์ ๋ชจ๋ ์ด์ ๊ณ์ฐ์ ์๋ฃํ๋ฉด, ๋ง์ง๋ง ํ์ ์๋ ๊ฐ์ฅ ํฐ ์๊ฐ ๋ฌธ์ ์ ์ ๋ต์ด ๋๋ค.
ํ๋ทธ๋ ์ด์ ์ ์ฌ์ฉํ ๋์ ํ๋ก๊ทธ๋๋ฐ โผ
function solution(land) {
const row = land.length;
const column = land[0].length;
const dp = Array.from({ length: row }, () => Array(column).fill(0)); // 2์ฐจ์ ๋ฐฐ์ด ์ด๊ธฐํ
dp[0] = land[0].slice(); // ์๋ณธ(land) ๋ฐฐ์ด์ ์ฒซ๋ฒ์งธ ํ์ ์ด๊ธฐ๊ฐ์ผ๋ก ์ง์
for (let i = 1; i < row; i++) {
for (let j = 0; j < column; j++) {
const prevRow = dp[i - 1].filter((_, index) => index !== j); // ๋์ผํ ์ด์ ์ ์ธ
const prevRowMax = Math.max(...prevRow); // ํ์ฌ ์ด์ ์ ์ธํ ์ด์ ํ์ ์ต๋๊ฐ ๊ณ์ฐ
dp[i][j] = prevRowMax + land[i][j]; // ํ์ฌ ์ด์ ์ ํํ์ ๋ ์ป์ ์ ์๋ ์ต๋ ์ ์ ์ ์ฅ
}
}
return Math.max(...dp.at(-1)); // ๋ง์ง๋ง ํ์ ์ต๋๊ฐ ๋ฐํ
}
์ด๋ ๊ฒ ๊ฐ ๋จ๊ณ์ ์ต์ ํด(์์ ํ์ ๋ฌธ์ ์ ํด๋ต)๋ฅผ ์ด์ฉํด ์ ์ฒด ๋ฌธ์ ์ ์ต์ ํด(ํฐ ๋ฌธ์ ์ ํด๋ต)๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ ๋์ ํ๋ก๊ทธ๋๋ฐ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
'๐ช Programming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[Algorithm] ์ ํด๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ / ์์ธ์๋ถํด๋ก ์ต์๊ณต๋ฐฐ์ ์ต๋๊ณต์ฝ์ ๊ณ์ฐํ๊ธฐ
[Algorithm] ์ ํด๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ / ์์ธ์๋ถํด๋ก ์ต์๊ณต๋ฐฐ์ ์ต๋๊ณต์ฝ์ ๊ณ์ฐํ๊ธฐ
2024.05.26 -
[TS] ํ์ ์คํฌ๋ฆฝํธ ๊ตฌ์กฐ์ ํ์ดํ ํ์ฉํ๊ธฐ
[TS] ํ์ ์คํฌ๋ฆฝํธ ๊ตฌ์กฐ์ ํ์ดํ ํ์ฉํ๊ธฐ
2024.05.25 -
[JS] split() ๋ฉ์๋์์ ๋น ๋ฌธ์์ด์ด ์๊ธฐ๋ ์๋ฆฌ
[JS] split() ๋ฉ์๋์์ ๋น ๋ฌธ์์ด์ด ์๊ธฐ๋ ์๋ฆฌ
2024.05.24 -
[React] Proxy๋ฅผ ํ์ฉํ Custom Lazy Import
[React] Proxy๋ฅผ ํ์ฉํ Custom Lazy Import
2024.05.24