가장 윗줄에 1부터 N까지의 숫자가 한 개씩 적혀 있다. 그리고 둘째 줄부터 차례대로 파스칼 의 삼각형처럼 위의 두개를 더한 값이 저장되게 된다. 예를 들어 N이 4 이고 가장 윗 줄에 3 1 2 4 가 있다고 했을 때, 다음과 같은 삼각형이 그려진다.
3 1 2 4
4 3 6
7 9
16
N과 가장 밑에 있는 숫자가 주어져 있을 때 가장 윗줄에 있는 숫자를 구하는 프로그램을 작성하 시오. 단, 답이 여러가지가 나오는 경우에는 사전순으로 가장 앞에 오는 것을 출력하여야 한다.
N | F | result |
---|---|---|
4 | 16 | [3,1,2,4] |
3 1 2 4
밑의 4 3 6
은 각각 3+1
, 1+2
, 2+4
로 풀어낼 수 있다. 또 4 3 6
밑의 7 9
역시 각각 3+1+1+2
, 1+2+2+4
로 풀어낼 수 있다.16
까지 내려오면, 16 === 3+1+1+2+1+2+2+4
로 나타낼 수 있으며, 식의 뒷변을 축약하면 (1*3) + (2*3) + (3*1) + (4*1)
로 표현된다.3 1 2 4
와 방금 축약한 식을 비교해보면 [3,1,2,4] |
---|
[1,3,3,1] |
nC0 nC1 nC2 nC3
과 같다.n-1C0, n-1C1, n-1C2, n-1C3
이다.const solution = (n, f) => {
const answer = [];
const temp = [];
const check = new Array(n).fill(0);
const combiArr = [];
const permuArr = [];
let flag = 0;
const memo = Array.from(Array(11), () => Array(11).fill(0));
const combi = (n, r) => {
if (memo[n][r]) return memo[n][r];
if (n === r || r === 0) return 1;
else {
return (memo[n][r] = combi(n - 1, r - 1) + combi(n - 1, r));
}
};
const DFS = (L, sum) => {
if (flag) return;
if (L === n && sum === f) {
answer = [...permuArr];
flag = 1;
} else {
for (let i = 0; i < n; i++) {
if (check[i] === 0) {
check[i] = 1;
permuArr[L] = i + 1;
DFS(L + 1, sum + permuArr[L] * combiArr[L]);
check[i] = 0;
}
}
}
};
for (let i = 0; i < n; i++) combiArr[i] = combi(n - 1, i);
DFS(0, 0);
return answer;
};