25๋ฒ. tiling
์ธ๋ก ๊ธธ์ด 2, ๊ฐ๋ก ๊ธธ์ด n์ธ 2 x n ๋ณด๋๊ฐ ์์ต๋๋ค. 2 x 1 ํฌ๊ธฐ์ ํ์ผ์ ๊ฐ์ง๊ณ ์ด ๋ณด๋๋ฅผ ์ฑ์ฐ๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ฆฌํดํด์ผ ํฉ๋๋ค.
๋ด๊ฐ ์ด ๋ต
let tiling = function (n) {
// 2 x 4 ๋ณด๋์ ํ์ผ์ ๋๋ ๊ฒฝ์ฐ
// 1) ์ฒ์์ ์ธ๋ก๋ก ํ๋ ๋๋ ๊ฒฝ์ฐ : 2 x 1 + 2 x 3
// 2) ๊ฐ๋ก๋ก ๋๋ ๊ฒฝ์ฐ (๋ฐ์๋ ๊ฐ๋ก๋ก ๋๊ฒ ๋จ) : 2 x 2 + 2 x 2
// => ์ฆ n=4 ์ผ ๋ ๊ฒฝ์ฐ์ ์ : n = 2, 3 ์ผ ๋๋ฅผ ๋ํ ๊ฒ (์ฌ๊ท)
let arr = [0,1,2];
const boxTiling = (n) => {
if(arr[n]) return arr[n];
return arr[n] = boxTiling(n-1) + boxTiling(n-2);
}
return boxTiling(n);
};
๋ ํผ๋ฐ์ค ๐
DP(Dynamic Programming)
๐ซ memoization
- ์ฃผ์ด์ง ์ ๋ ฅ๊ฐ์ ๋ํ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํจ์ผ๋ก์จ ๊ฐ์ ์ ๋ ฅ๊ฐ์ ๋ํด ํจ์๊ฐ ํ ๋ฒ๋ง ์คํ๋๋ ๊ฒ์ ๋ณด์ฅํ๋ค(๋ณดํต ๋์ ๋๋ฆฌ์ ์ ์ฅํ๋ค). ์ฆ ์ฃผ์ด์ง ๊ฐ์ด ์๋ค๋ฉด ๊ทธ๊ฑธ ๊บผ๋ด ์ฐ์ง ๋ค์ ๋ฐ๋ณตํด์ ์คํํ์ง ์๋ ๋ฐฉ๋ฒ!
- top-down approach (ํํฅ์)
- memoization์ ์ด์ฉํ ์ฌ๊ทํจ์ ๋ฐฉ๋ฒ์ O(N)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๋ํ๋ธ๋ค.
let tiling = function (n) {
// ์ธ๋ฑ์ค๋ฅผ ์ง๊ด์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด
// ์ ๋ถ๋ถ์ ์๋ฏธ์๋ ๋ฐ์ดํฐ(dummy)๋ก ์ฑ์ด๋ค.
const memo = [0, 1, 2];
// ์ฌ๊ท๋ฅผ ์ํ ๋ณด์กฐ ํจ์(auxiliary function)์ ์ ์ธ)
const aux = (size) => {
// ์ด๋ฏธ ํด๊ฒฐํ ๋ฌธ์ ๋ ํ์ง ์๋๋ค.
if (memo[size] !== undefined) return memo[size];
if (size <= 2) return memo[n];
memo[size] = aux(size - 1) + aux(size - 2);
return memo[size];
};
return aux(n);
};
๐ซ tabulation
- ์ด๋ค ๊ฐ์ ๊ตฌํ๊ธฐ ์ํด ์์๋๋ก๊ฐ์ ๊ตฌํด ๋๊ฐ์ผ๋ก์จ ์ค๋ณต๋ ๊ณ์ฐ์ ํ์ง ์๊ณ ๋ค์๊ฐ์ ๋น ๋ฅด๊ฒ ๊ตฌํด๋๊ฐ๋ ๋ฐฉ๋ฒ
- ํ ์ด๋ธ์ ๊ทธ๋ ค๋๊ณ ํ๋์ฉ ์งํํ๋ฉฐ ์ ์ฅํ๋ ๋ฐฉ์์ด๋ค. ์ ์ผ ์ต์์ ๋จ์๋ถํฐ ๋ฌธ์ ์ ๊ฐ์ ํ ์ด๋ธ์ ์ ์ฅํด ๋๊ฐ๋ฉฐ, ์ ์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ผ๋ฉด ๊ฑฐ๊ธฐ์ ํด๋น ๊ฐ์ ๋ฆฌํด
- bottom-up approach (์ํฅ์)
let tiling = function (n) {
const memo = [0, 1, 2];
if (n <= 2) return memo[n];
for (let size = 3; size <= n; size++) {
memo[size] = memo[size - 1] + memo[size - 2];
}
return memo[n];
};
๐ซ slicing window
- ํ์ํ ์ต์ํ์ ๋ฐ์ดํฐ๋ง์ ํ์ฉํ๋ ๊ฒ์ ๋งํฉ๋๋ค.
- ์ด ๋ฌธ์ ์์๋ , ํฌ๊ธฐ n์ ๋ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ์ต์ ํ์ํ ๋ฐ์ดํฐ๊ฐ 2๊ฐ ๋ผ๋ ๊ฒ์ ๊ธฐ์ตํ๋ค.
- ๊ฐ์ด ์ผ์ ํ ๋ฒ์๋ฅผ ๊ฐ์ง๋ ๊ฒ์ ์ ์งํ ์ฑ ์ด๋ํ๋ฉฐ ๊ณ์ฐ๋๋ ๋ฐฉ๋ฒ, ์ต์ํ์ ๋ฐ์ดํฐ๋ง์ ํ์ฉํ๋ ๋ฐฉ๋ฒ (๊ฐ์ฅ ์์ ๊ฒฝ์ฐ์ ์๋ถํฐ ํ๋์ฉ ์ด๋ํ๋ ๋๋์ผ๋ก ๊ณ์ฐ๋ ๊ฐ์ ๋์ ํด๋๊ฐ๋ ๋ฐฉ๋ฒ?)
- fst,snd ๋ ๊ฐ์ ๋ณ์๋ฅผ ์ ํด์ค์ผ๋ก์จ ํ ์นธ์ฉ ์ด๋ํด๋๊ฐ๋ฉฐ fst์ snd๋ฅผ ํ ๋น, ๋ ๋ณ์์ ํฉ์ snd์ ํ ๋นํจ์ผ๋ก์จ n๊น์ง ํฉ์ ๋์ ํด๊ฐ๋ฉฐ ๊ฐ์ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ด๋ค.
let tiling = function (n) {
let fst = 1,
snd = 2;
if (n <= 2) return n;
for (let size = 3; size <= n; size++) {
const next = fst + snd;
fst = snd;
snd = next;
}
return snd;
};
'Algorithm > DailyCoding' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[23.02.21] Daily Coding 22 - fibonacci (0) | 2023.05.19 |
---|---|
[23.02.20] Daily Coding 21 (0) | 2023.05.19 |
[22.10.04] Daily Coding 10 (0) | 2023.05.17 |
[22.09.30] Daily Coding 9 (1) | 2022.09.30 |
[22.09.29] Daily Coding 8 (0) | 2022.09.30 |