๐ section08 - 13 - ์์ด ์ถ์ธกํ๊ธฐ
๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ๋ค. ๊ฐ์ฅ ์์ค์ 1๋ถํฐ N
๊น์ง์ ์ซ์๊ฐ ํ ๊ฐ์ฉ ์ ํ ์๋ค. ํ์ค์นผ์ ์ผ๊ฐํ์ ์๋ก ๋ค์ด N
์ด 4์ด๊ณ ๊ฐ์ฅ ์ ์ค์ 3 1 2 4
๊ฐ ์๋ค๊ณ ํ ๋ ๋ค์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๊ทธ๋ ค์ง๋ค.
N
๊ณผ ๊ฐ์ฅ ๋ฐ์ ์๋ ์ซ์๊ฐ ์ฃผ์ด์ ธ ์์ ๋ ๊ฐ์ฅ ์์ค์ ์๋ ์ซ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ์ฌ๋ฌ ๊ฐ์ง ๋ต์ด ๋์ค๋ฉด ์ฌ์ ์์ผ๋ก ๊ฐ์ฅ ์์ ์ค๋ ๊ฒ์ ์ถ๋ ฅํ๋ค.
// ์
๋ ฅ
4 16
// ์ถ๋ ฅ
3 1 2 4
๋ฌธ์ ๋ง ๋ณด๋ฉด ์กฐ๊ธ ์ด๋ ต๋ค๊ณ ์๊ฐํ๋๋ฐ, ์ด๋ป๊ฒ ํ์ด์ผ ํ ์ง ์์๋ฅผ ๋๋๋๊น ๊ด์ฐฎ์๋ค. ํ์ค์นผ์ ์ผ๊ฐํ ๊ณต์์ ์์์ผ ํ๋๋ฐ, ์กฐํฉ๊ณต์์ ์ฌ์ฉํ๋ฉด ํ์ค์นผ ์ผ๊ฐํ์ ๊ตฌํ ๋ ์ฒ์๋ถํฐ ๋๊น์ง ๋ ํญ์ ๋ํด์ ๋์ ํ๋ ๋ถ ํ์ํ ๊ณ์ฐ์ ํ์ง ์์๋ ๋๋ค. ์๋ฅผ ๋ค์ด 1 2 3 4
๊ฐ ์ฃผ์ด์ง๋ค๊ณ ํ ๋ ๋ชจ๋ ์๋ฅผ ์ฐจ๋ก๋ก ๋ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.
์ฌ์ง ์ ์ผ ํ๋จ์ ์๋ 1+2+2+2+3+3+3+4
์ ๊ฐ์ ์์ธํ ์ดํด๋ณด๋ 1์ 1๋ฒ
, 2๋ 3๋ฒ
, 3์ 3๋ฒ
, 4๋ 1๋ฒ
์ด ์ฌ์ฉ๋๋ค. ์
๋ ฅ์ด 1 2 3 4
๊ฐ ์๋์ด๋ 4๊ฐ์ ์ซ์๋ฅผ ๋๋ค์ผ๋ก ์ผ๋ ฌ๋ก ๋์ดํ์ฌ ๊ตฌํด๋ ์ฌ์ฉ๋ ๊ฐ์๋ 1 3 3 1
๋ก ๋์ผํ๋ค. (5๊ฐ์ ์ซ์๋ 1 4 6 4 1
๋ฒ์ฉ ์ฐ์ธ๋ค.) ์ด๋ฅผ ์กฐํฉ์ผ๋ก ๋ํ๋ผ ์ ์๋๋ฐ, 1 3 3 1
์ 3C0, 3C1, 3C2, 3C3
์ผ๋ก ๋ํ๋ผ ์ ์๊ณ n
๊ฐ ์ผ ๋๋ n-1C0, n-1C1, ..., n-1Cn-2, n-1Cn-1
์ผ๋ก ๋ํ๋ผ ์ ์๋ค.
๋ค์ ๋ฌธ์ ๋ก ๋์๊ฐ์ ์ถ๋ ฅ ๊ฐ์ ํ์ค์นผ ์ผ๊ฐํ์ ๊ฐ์ฅ ์์ค์ ์๋ ์ซ์๋ผ๋ฆฌ ๋ํ ๊ฐ์ด `target`๊ณผ ๊ฐ์ ์ซ์๋ฅผ ์ถ๋ ฅํด์ผํ๋๋ฐ, ์ ํํ๊ฒ ์ด๋ค ์๊ฐ target
๊ณผ ๋์ผํ์ง ๋ชจ๋ฅด๋๊น 1๋ถํฐ N
๊น์ง ์ผ๋ ฌ๋ก ๋์ดํ๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์(์ค๋ณต์ ํ๋ฝํ์ง ์๋ ์์ด, ์ฌ๊ธฐ์๋ 4*3*2*1=24
)๋ฅผ ์ฐพ๊ณ ํด๋น ์๋ฅผ ํ์ค์นผ์ ๊ณต์ 1 3 3 1
์ ์ด์ฉํ์ฌ ํ๋์ฉ ๊ณฑํด์ ๋ชจ๋ ๋ํ ๊ฐ์ด target
๊ณผ ๊ฐ์์ง ํ์ธํ๋ฉด ๋๋ค.
์ค๋ณต์ ํ๋ฝํ์ง ์๋ ์์ด์ visited
๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ์ฒดํฌํด์ฃผ๋ฉด ๋๋ค. ์ฌ๊ท๋ฅผ ์ด์ฉํ์ฌ ์์ด์ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ ์ ๋ชจ๋ฅด๊ฒ ๋ค๋ฉด ๋ค์์ ์ฐธ๊ณ ํ์.
์ฌ๋ด์ผ๋ก ํ์ด๋ฅผ ๋ณด์ง์๊ณ ๋ด๊ฐ ํ์์ ๋๋ ์กฐํฉ(1 3 3 1)์ ํ ๋ฒ์ ๊ตฌํด๋๊ณ ์ข
๋ฃ ์กฐ๊ฑด์ ๋๋ฌํ์ ๋ `for`๋ฌธ์ ์ฌ์ฉํ์ฌ index
๋ผ๋ฆฌ ๊ณฑํ๋๋ฐ ์ ์๋์ ์์ DFS
ํจ์ ์ธ์์ sum
์ ๋ฃ์ด ์ฌ๊ท๋ฅผ ๊ณ์ฐํ ๋๋ง๋ค ๋ํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์
จ๋ค. ์ด๋ ๊ฒ ๊ณ์ฐํ๋ฉด ์ข
๋ฃ์กฐ๊ฑด์ ๋๋ฌํ ๋๋ง๋ค `for`๋ฌธ์ ๋์๋ ๋์ง ์์์ ์ ์๋ณด๋ค ์ฐ์ฐ์๋๊ฐ ๋นจ๋ผ์ง๋ ์ฅ์ ์ด ์๋ค.
- 1๋ถํฐ
N
๊น์ง ์ค๋ณต์ ํ๋ฝํ์ง ์๊ณ ์ผ๋ ฌ๋ก ๋์ดํ๋ ๋ฐฉ๋ฒ(์ค๋ณต์ ํ๋ฝํ์ง ์๋ ์์ด)์ ๊ตฌํ๋ค. n-1C0 ~ n-1Cn-1
๊น์ง ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๋ค.(์ด๋, ์ฐ์ฐ์๋๋ฅผ ๋ฎ์ถ๊ธฐ ์ํด ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ฌ์ฉ)- 1๋ฒ์์ ๊ตฌํ ๊ฐ์ ๊ฐ๊ฐ์
index
์ ๋ง๊ฒ 2๋ฒ ๊ฐ์ ๊ณฑํ๋ค. (DFSํจ์์ ์ธ์๋ก ๋๊ฒจ ์ฌ๊ท๊ฐ ๋ป์ด๋๊ฐ ๋๋ง๋ค ๊ณ์ฐํ๋ค.) - 3๋ฒ์์ ๊ตฌํ ๊ฐ์ ๋ชจ๋ ๋ํด
target
๊ณผ ๊ฐ์ ๊ฐ์ธ์ง ํ์ธํ๋ค. - ์ฒ์์ผ๋ก ๊ฒฐ๊ณผ๊ฐ ๋๋ ๊ฐ์ ์ถ๋ ฅํ๋ค. (
flag=true
๋ก ๋ฐ๊ฟ ๊ทธ๋ค์ ๋ถ ํ์ํ ์ฐ์ฐ์ ์ค์ธ๋ค.)
let n = 4;
let target = 16;
console.log(solution(n, target));
function solution(n, target){
let memo = Array.from(Array(11), () => Array(11).fill(0));
let visited = Array.from({length: n+1}, () => 0);
let arr = Array.from({length: n}, () => 0);
let combi = Array.from({length: n}, () => 0);
let answer;
function pascal(n, r){
if (memo[n][r]) return memo[n][r];
if (n===r || r===0) return 1;
else return memo[n][r] = pascal(n-1, r-1) + pascal(n-1, r);
}
for (let i=0; i<n; i++) combi[i] = pascal(n-1, i);
let flag = false;
function DFS(L, sum){
if (flag) return;
if (L === n && sum === target){
answer = arr.slice();
flag = true;
}else{
for (let i=1; i<=n; i++){
if (visited[i] === 0){
visited[i] = 1;
arr[L] = i;
DFS(L+1, sum+(arr[L]*combi[L]));
visited[i]=0;
}
}
}
}
DFS(0, 0)
return answer;
}
๐๐ฝ 3 1 2 4
๋๊ธ