3층 ...
2층 [1] [4] [10] [20] [35]
1층 [1] [3] [6] [10] [15]
0층 [1] [2] [3] [4] [5]
점화식 : k층 n호 = k층 n-1호 + k-1층 n호
문제는 차근차근 읽으면 이해할 수 있었는데 그것을 코드로 옮기는 과정에서 아주 애먹은 문제이다.
// 백준 2775번 부녀회장이 될테야
const fs = require('fs');
const input = fs.readFileSync("input.txt").toString().trim().split("\n");
const testNum = parseInt(input.shift(), 10);
for (let i=0; i<testNum; i++) {
let k = parseInt(input.shift(), 10);
let n = parseInt(input.shift(), 10);
let result = Array.from(Array(k+1), ()=> Array(n).fill(0));
// 0층
for (let a=0; a<n; a++) {
result[0][a] = a+1;
}
for (let a=1; a<k+1; a++) {
for (let b=0; b<n; b++) {
if (b===0) {
result[a][b] = 1;
} else {
result[a][b] = (result[a][b-1] + result[a-1][b]);
}
}
}
console.log(result[k][n-1]);
}
shift()
배열에서 첫 요소를 반환하고 삭제한다. 배열의 길이를 변하게 한다.
from()
매개변수로 받은 값을 얕은 복사를 통해서 새로운 배열을 만든다.
fill()
배열의 시작부터 끝까지 정적인 값으로 채운다.
가장 부모 for문
testcase의 개수만큼 반복한다.
k, n, result
k와 n은 처음에 받은 input에서 shift()
로 하나씩 제거해가며 받았다. 한번만 사용할 것이고 몇 번 실행할지 testcase의 개수는 변수로 지정되어있으니 shift()
를 사용해도 되겠다.
result는 2차원 배열을 0으로 초기화해서 선언해주었다. (k+1)*n 2차원 배열이다.
0층 for문
0층에는 따로 계산할 필요 없이 주어진 n값만큼 1부터의 숫자를 넣어주면 된다.
결과 구하는 for문
a -> 층수만큼
b -> 호수만큼
1호인 경우에는 무조건 1명이기 때문에 if문으로 해당 과정을 처리했다.
n호인 경우에는 점화식을 사용해 result에 값을 넣어준다.
입력 받는 부분부터 어떻게 해야할지 고민이 됐는데 처음에 testcase의 수를 주지만 k와 n 두 개의 값을 받아야해서 결국 shift()
를 사용해서 받게 되었다.
원래는 2차원 배열 초기화 선언을 하지 않고 배열을 만들어서 배열에 넣고 ... 이런 과정으로 진행하려다가 훨씬 복잡해지는 것 같아서 이 방법을 선택했다...
중첩 반복문을 사용해야하는 경우 복잡하게 생각이 되고 코드 작성이 더 힘들어진다는 것을 뼈저리게 느꼈다.