[DAY-7] JS ์ฃผ์ ๋ฌธ๋ฒ(7)
๐ ํท๊ฐ๋ ธ๋ & ๋ชฐ๋๋ ๋ถ๋ถ๋ค๋ง ์ ๋ฆฌํ๋ ๋๋ง์ TIL
๐ฏ ๋ชจ๋ ๊ฐ์ ๋ด์ฉ์ ์ ์ง ์์์!
์ค๋์ ์๊ฐ์?
์ง์ง ๋จ์ด ์กฐ๊ฐ ๋ฌธ์ ํ๋ค๊ฐ ์ฐ๋ ์ธ ๋ป ํ์ต๋๋ค.
์ ๋ ์๊ณ ๋ฆฌ์ฆ ์ ํ ์ค์ ๊ทธ๋ฆฌ๋์ DP๊ฐ ๊ฐ์ฅ ์ด๋ ต๋จ ๋ง์ด์์!
๋ฐฑํธ๋ํน, BFS, DFS๋ง ํ์ง ๋ง๊ณ , ์ทจ์ฝํ ๋ถ๋ถ ์์ฃผ๋ก ์ฐ์ตํด์ผ๊ฒ ์ต๋๋ค.
[1] ๋ฐฑํธ๋ํน
- ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
- DFS๋ BFS๋ฅผ ์ด์ฉํ ์ ์์ต๋๋ค.
- ํจ์จ์ ์ํด ํ์ํ์ง ์์๋ ๋๋ ๊ณณ์ ๋ฏธ๋ฆฌ ๋ง๋ ๊ฒ์ ๊ฐ์ง์น๊ธฐ(Pruning)์ด๋ผ ํฉ๋๋ค.
- JS๋ ์ฌ๊ท ํจ์จ์ด ๋๋น DFS๋ฅผ ๊ตฌํํ ๊ฒฝ์ฐ, ์คํ์ ์ด์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ฝ๋ฉ ํ ์คํธ์์๋ ์ด๋ฅผ ๊ณ ๋ คํ์ฌ ์ฌ๊ท๋ก ์์ฑํด๋ ํ ์ ์๋๋ก ๋ฌธ์ ๋ฅผ ์ ์ถํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. - ํ์์์ ์ํ(Cycle)์ด ๋ฐ์ํ ์ ์๋ค๋ฉด BFS๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด ํธํฉ๋๋ค.
[+] ์ค์ต ์ฝ๋ - N-Queen
๐์คํ ํ๋ ๋๋ฌธ์ 2์๊ฐ ๋ ๋ฆฐ N-Queen..
๋๋ฒ๊น ๋ง ํ์๊ฐ ํ ๊ฒ ๊ฐ์๋ฐ i๋ฅผ 1๋ก ์๋ชป ์ผ์๋ค์ ํํ
>
ํ์ด ๋ฐฉ๋ฒ์ ์ฒด์คํ ์ ์ฒด๋ฅผ ํ์ํ๋ ๊ฒ์ด ์๋๋ผ, row๋ก๋ง ํ์ํฉ๋๋ค.
> row์ ์ธ๋ฑ์ค๋ ํ, row์ ๊ฐ์ ์ด๋ก ๋๊ณ ํ์ด๋ฅผ ์งํํฉ๋๋ค.
>
checkํจ์์์ ์ธ๋ฑ์ค๊ฐ ๊ฐ์ ๊ฒฝ์ฐ์ return false
ํ, ์ด์ ๋ํ ์ฐจ๊ฐ ๊ฐ์ ๊ฒฝ์ฐ์ (๋๊ฐ์ ์ ์์น) return false๋ก ๋ฐฑํธ๋ํนํด์ค๋๋ค.
function check(index, row) {
for (let i = 0; i < index; i += 1) {
if (row[index] === row[i]) {
return false;
}
if (Math.abs(row[index] - row[i]) === index - i) {
return false;
}
}
return true;
}
function solution(n) {
let count = 0;
let row = new Array(n).fill(0);
function dfs(index) {
if (index === n) {
count += 1;
return;
}
for (let i = 0; i < n; i += 1) {
row[index] = i;
if (index === 0 || (index > 0 && check(index, row))) {
dfs(index + 1);
}
}
}
dfs(0);
return count;
}
[2] ๋์ ๊ณํ๋ฒ(Dynamic Programming)
- ํด๊ฒฐํ ์์ ๋ฌธ์ ๋ก ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฌธ์ ํ์ด ๋ฐฉ์์ ๋๋ค.
- ๊ทธ๋ฆฌ๋๋ ๋ฐฑํธ๋ํน์ฒ๋ผ ํน์ ์๊ณ ๋ฆฌ์ฆ์ด ์๋ ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ์์ ์๋ฏธํฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ ๋์ ๋น ๋ฅธ ์ฑ๋ฅ์ ์๋ํฉ๋๋ค.
- ๋ ๊ฐ์ง ๋ฐฉ๋ฒ๋ก ์ด ์์ต๋๋ค.
- ๋ฉ๋ชจ์ด์ ์ด์
(Menoization)
- ํ๋ทธ๋ ์ด์ (Tabulation)
[2-1] ๋ฉ๋ชจ์ด์ ์ด์
- ํํฅ์ ์ ๊ทผ๋ฒ
- ๋์ ๊ฒํ๋ฒ์์ ์์ ๋ฌธ์ ๋ค์ ๊ฒฐ๊ณผ๋ ํญ์ ๊ฐ์ผ๋ฏ๋ก
์ด ๊ฒฐ๊ณผ๋ค์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํด ํ์ํ ๋ ๊บผ๋ด ์ฐ๋ ๊ฒ์ด ๋ฉ๋ชจ์ด์ ์ด์ ์ ๋๋ค.
[2-2] ํ๋ทธ๋ ์ด์
- ์ํฅ์ ์ ๊ทผ๋ฒ
- ํ์ํ ๊ฐ๋ค์ ๋ฏธ๋ฆฌ ๊ณ์ฐํด๋๋ ๊ฒ
๋ฉ๋ชจ์ด์ ์ด์ ์ ํ์ํ ๋ ๊ณ์ฐํ๋ค๋ฉด (Lazy evalution)
ํ๋ทธ๋ ์ด์ ์ ๋ฏธ๋ฆฌ ๊ณ์ฐํด๋ก๋๋ค. (Eager evaluation)
>
๋ณดํต์ ์ฝ๋ฉ ํ ์คํธ์์๋ ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ฐ๋ ๊ฒฝ์ฐ๊ฐ ๋๋ถ๋ถ์ ๋๋ค.
[2-3] ์ ๊ทผ๋ฒ
- ๊ฐ์ฅ ์์ ๋ฌธ์ ๋ฅผ ์ ์ํ ์ ์๋์ง
- ์์ ๋ฌธ์ ๋ฅผ ํตํด ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ๊ท์น์ด ์๋์ง
์ ๋ ๊ฐ์ง๊ฐ ๊ฐ๋ฅํ๋ค๋ฉด ๋์ ๊ณํ๋ฒ ๋ฌธ์ ์ ๋๋ค.
๊ฐํน ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋๋ฌด ์ฌ์ฉํ์ฌ ํต๊ณผ ๋ชปํ๋ ๊ฒฝ์ฐ๋ ์๊ธฐ์ง๋ง, ์ด๋ฐ ๊ฒฝ์ฐ์ ๋ฐฑํธ๋ํน์ ์ด์ฉํ ์ ์์ต๋๋ค.
[+] ์ค์ต ์ฝ๋ - ๋จ์ด ์กฐ๊ฐ
๐ฅ ํ๋ค๊ฐ ์ธ๋ปํ์ต๋๋ค.
>
๋ชจ๋ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ์ ํ ์ค ๊ทธ๋ฆฌ๋์ dp๋ฅผ ์ ์ผ ์ด๋ ค์ํ๋ ์ ์๊ฒ ๋จ์ด ์กฐ๊ฐ ๋ฌธ์ ๋ ์ ๋ง ํ๋ค์์ต๋๋ค.
>
> ์๋ฆฌ)
- ๋จ์ด๋ฅผ ๋ฌธ์์ด์์ ์๋ผ์ ๋จ์ด ์กฐ๊ฐ์ ์๋์ง ๋น๊ตํฉ๋๋ค.
- ์์ผ๋ฉด ํด๋น ๋จ์ด์ ๊ฐ์๋ก dp[๋จ์ด ๋์๋ฆฌ idx + 1]๋ฅผ ๊ฐฑ์ ํฉ๋๋ค.
- ๊ทธ ๋ค์ ๋จ์ด๋ถํฐ๋ ๋จ์ด ์กฐ๊ฐ์ ์์ ์, dp[๋จ์ด ์ฒซ์๋ฆฌ]+1๊ณผ dp[๋จ์ด ๋์๋ฆฌ idx + 1]๋ฅผ ๋น๊ตํด
์ต์ ๊ฐ์ dp[๋จ์ด ๋์๋ฆฌ idx + 1]์ ์ ์ฅํฉ๋๋ค. - ๋งค๋ฒ dp[๋จ์ด ๋์๋ฆฌ idx + 1]๋ 20000(์ต๋๊ฐ)์ผ๋ก ์ด๊ธฐํํด์ฃผ๊ธฐ ๋๋ฌธ์,
๋ง์ฝ ๋ฐ๋ณต๋ฌธ์ด ๋๋ ํ dp[์ฃผ์ด์ง ๋ฌธ์์ด์ ๊ธธ์ด]์ ๊ฐ์ด 20000๋ณด๋ค ๊ฐ๊ฑฐ๋ ํฌ๋ฉด ๋จ์ด ์กฐ๊ฐ๋ค๋ก ํด๋น ๋ฌธ์์ด์ ๋ง๋ค ์ ์์์ ๋ปํฉ๋๋ค.
์์) banana / [ba, na, n, a]
1. b๋ถํฐ ๋จ์ด ์กฐ๊ฐ์ ์๋์ง ๊ฒ์ฌํฉ๋๋ค.
โ ์์ผ๋ dp[1]์๋ 20000์ด ๊ทธ๋๋ก ์ ์ฅ (dp[๋จ์ด ๋์๋ฆฌ idx] + 1)
2. a๋ก ๋๋๋ ๋จ์ด์ธ ba, a๋ฅผ ๋จ์ด ์กฐ๊ฐ์ ์๋์ง ๊ฒ์ฌํฉ๋๋ค.
โ a๊ฐ ์์ผ๋ dp[2] ๊ฐ์ dp[1] + 1 ๊ฐ (20001)๊ณผ dp[2] (20000) ์ค ์ต์๊ฐ ์ ์ฅ = 20000
โ ba๊ฐ ์์ผ๋ dp[2] ๊ฐ์ dp[0] + 1๊ฐ (1)๊ณผ dp[2] (20000) ์ค ์ต์๊ฐ ์ ์ฅ = 1
3. n์ผ๋ก ๋๋๋ ๋จ์ด์ธ n, an, ban์ ๋จ์ด ์กฐ๊ฐ์ ์๋์ง ๊ฒ์ฌํฉ๋๋ค.
โ n์ด ์์ผ๋ dp[3] ๊ฐ์ dp[2] + 1 ๊ฐ (2)๊ณผ dp[3] (20000) ์ค ์ต์๊ฐ ์ ์ฅ = 2
โ an๊ณผ ban์ ์์
4. a๋ก ๋๋๋ ๋จ์ด์ธ a, na, ana, bana๋ฅผ ๋จ์ด ์กฐ๊ฐ์ ์๋์ง ๊ฒ์ฌํฉ๋๋ค.
โ a๊ฐ ์์ผ๋ dp[4] ๊ฐ์ dp[3] + 1 ๊ฐ(3)๊ณผ dp[4] (20000) ์ค ์ต์๊ฐ ์ ์ฅ = 3
โ na๊ฐ ์์ผ๋ dp[4] ๊ฐ์ dp[2] + 1๊ฐ (2)๊ณผ dp[4] (3) ์ค ์ต์๊ฐ ์ ์ฅ = 2
โ ana, bana ์์
โฆ
ํด๋น ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค๋ณด๋ฉด dp์ ๋งจ ๋ง์ง๋ง ๋ถ๋ถ์ ์ต์ ๋จ์ด์ ๊ฐ์๊ฐ ์ ์ฅ๋ฉ๋๋ค. ๐
// ๋ฉ๋ชจ์ด์ ์ด์
// ๊ฐ ๋จ์ด๋ฅผ ๋ง๋ค ์ ์๋ ์ต์ ๊ฐฏ์์ ๋จ์ด๋ฅผ ์ ์ฅํด๋๋๋ค.
// ๋ค์ ๋จ์ด๊ฐ ๋ค์ด์์ ๋, ์ ์ฅํ ๋จ์ด + ๋ค์ ์ต์ ๊ฐฏ์ ๋จ์ด
// ๋ง์ฝ ์ต์๊ฐ์ด ๊ฐฑ์ ๋๋ฉด ๋ฉ๋ชจํด๋์ ๋จ์ด์ ์๋ ๊ฐฑ์
function solution(strs, t) {
let tLen = t.length;
let dp = new Array(tLen + 1).fill(0);
let answer = 0;
// k์ ๋ฒ์๋ 1, 6์ผ๋ก ์ง์ ํด์ i๋ฒ์๋ ํธํ๊ฒ 1, tLen + 1๋ก ์ง์
// i๋ ์๋ผ์ ๋จ์ด ์กฐ๊ฐ๋ค๊ณผ ๋น๊ตํ '์๋ฅธ ๋จ์ด'์ ๋ ๊ธ์
for (let i = 1; i < tLen + 1; i += 1) {
// ์ต์๊ฐ ๋น๊ต๋ฅผ ์ํด 200000์ผ๋ก ์ด๊ธฐํ ํด์ค๋ค.
// ๋ง์ฝ ํด๋นํ๋ ๋จ์ด๊ฐ ๋จ์ด ์กฐ๊ฐ์ ์์ด์ ์กฐ๊ฑด๋ฌธ์ ๋ค์ด๊ฐ์ง ์์ผ๋ฉด
// 200000์ด ์ ์ง๋๊ณ dp[-1]์ด >= 200000์ด๋ฉด ํด๋น ๋จ์ด์กฐ๊ฐ๋ค๋ก ๋ฌธ์์ด์ ๋ง๋ค์ง ๋ชปํ๋ค๋ ๋ป.
dp[i] = 200000;
// ๋จ์ด ์กฐ๊ฐ์ ๊ธธ์ด๋ 1์ด์ 5 ์ดํ
for (let k = 1; k < 6; k += 1) {
// s๋ถํฐ i ์ฌ์ด์ ๋ฌธ์์ด์ ์๋ฅผ๊ฒ๋๋ค.
let s = i - k;
// ์์๋ฉด ๊ทธ๋ฅ ๋งจ ์ฒซ๋ฒ์งธ๋ถํฐ ์๋ฅด๋๊ฑฐ๋ ๋ค๋ฅผ ๊ฒ ์๋ค.
if (s < 0) s = 0;
// s๋ถํฐ i ์ ๊น์ง ์๋ผ์ค๋๋ค.
tSplit = t.substring(s, i);
// ๋จ์ด ์กฐ๊ฐ ๋ชจ์ ๋ฐฐ์ด์์ ํด๋น tSplit์ ๊ฐ์ง๊ณ ์์ผ๋ฉด dp ๋ฐฐ์ด์์ ์ต์๊ฐ์ ๋น๊ตํฉ๋๋ค.
// dp๋ฐฐ์ด[๋จ์ด ๋์๋ฆฌ idx] = ์ต์๊ฐ(dp[๋จ์ด ๋์๋ฆฌ idx], dp[ํด๋น ๋จ์ด์ ์ฒซ์๋ฆฌ idx] + 1)
// ๊ทธ๋ฌ๋๊น, ์๋ฅธ ๋จ์ด๊ฐ ๋จ์ด ์กฐ๊ฐ ๋ชจ์์ ์์ด์ ์๋ก ๊ฐ์ด ๊ฐฑ์ ๋ ์ ์๋์ง
// ์๋๋ฉด ์ ์ ์ ์ฅ๋ ๊ฐ + 1 (๋จ์ด์ ๊ฐ์ += 1)์ธ์ง ์ต์๋ฅผ ๊ตฌํ๋ค.
if (strs.includes(tSplit)) {
dp[i] = Math.min(dp[i], dp[s] + 1);
}
}
}
if (dp[tLen] >= 200000) answer = -1;
else answer = dp[tLen];
return answer;
}
๋๊ธ๋จ๊ธฐ๊ธฐ