백준 JS | 2775번 부녀회장이 될테야
출처: 백준 온라인저지
https://www.acmicpc.net/problem/2775
문제
“a층의 b호에 살려면 자신의 아래(a-1)층의 1호부터 b호까지 사람들의 수의 합만큼 사람들을 데려와 살아야 한다” 는 계약조항을 지켜야만 거주할 수 있는 아파트가 있다.
아파트에 비어있는 집은 없고 모든 거주민들이 이 계약 조건을 지키고 왔다고 가정했을 때, 주어지는 양의 정수 k와 n에 대해 k층에 n호에는 몇 명이 살고 있는지 출력하라. 단, 아파트에는 0층부터 있고 각층에는 1호부터 있으며, 0층의 i호에는 i명이 산다.
입력
첫 번째 줄에 Test case의 수 T가 주어진다. 그리고 각각의 케이스마다 입력으로 첫 번째 줄에 정수 k, 두 번째 줄에 정수 n이 주어진다
출력
각각의 Test case에 대해서 해당 집에 거주민 수를 출력하라.
제한
1 ≤ k, n ≤ 14
나의 답안 ( 오답 )
const input = require("fs")
.readFileSync("example.txt")
.toString()
.trim()
.split("\n");
const testCase = input[0];
// 0층에 사는 거주민들의 배열
const firstFloor = [];
// 확인하고자 하는 층 바로 아래층 거주민들의 배열
let underFloor = [];
// 각 층에 사는 거주민들의 배열
let newArr = [];
let humans = 1;
// testCase 반복문
for (let i = 1; i < testCase * 2; i = i + 2) {
const targetFloor = input[i];
const targetNum = input[i + 1];
// 매 경우의 수에서 0번째 층을 배열로 표현하기 위한 firstFloor 세팅
while (humans <= targetNum) {
firstFloor.push(humans);
humans++;
}
// 층수 반복
for (let j = 0; j < targetFloor; j++) {
// 호수 반복
for (let k = 0; k < targetNum; k++) {
// 매층 각 호수에 사는 거주민들의 배열을 만들기 위한 코드
if (k === 0) {
newArr[0] = underFloor[0];
} else {
newArr[k] = underFloor[k] + newArr[k - 1];
underFloor[k] = newArr[k];
}
}
// 예상과 다르게 NaN 값이 하나 더 찍혀서 넣어준 코드..
if (newArr[targetNum - 1]) {
console.log(newArr[targetNum - 1]);
}
// 아래층을 의미하는 underFloor가 맨 처음에는 firstFloor 이기 때문에 초기화
underFloor = firstFloor;
}
}
1. firstFloor : 첫번째 층의 거주민 배열 , underFloor : 아래층의 거주민 배열 , newArr : 각 층에 사는 거주민 배열
2. testCase 에 대한 반복문 작성
3. 해당 반복문 안에 첫번째 층의 거주민 배열을 구하기 위한 반복문 작성 ( testCase 마다 구하고자 하는 호수가 다르기 때문)
4. 2가지 반복문을 중첩하여 각 층에 사는 거주민 배열을 newArr에 만들고, underFloor 배열에 할당하여 업데이트하면서 최종에는 확인하고자 하는 층수의 거주민 배열을 만든다.
5. 최종 거주민 배열이 확인하고자 하는 층의 배열이므로, 해당 배열의 가장 마지막 index 의 값을 출력한다.
6. 이를 반복하기 위해 반복문이 끝나면 underFloor 배열은 다시 첫번째 층 배열로 초기화 한다.
이렇게 로직을 구성하고, 코드를 짰는데 테스트 케이스를 실행해보니 원치않는 console.log가 한번 더 출력되었다..
여기서부터 틀렸음을 직감...
테스트 케이스에 대해서는 답이 나오지만, 테스트 케이스를 한가지 더 추가했으나 원치않는 콘솔들이 연이어 찍히고 문제를 제출하니 시간초과 ㅠㅠ
아직도 테스트 케이스에 매몰되서 코드를 짜지 않으려고 노력 중인데 생각만큼 잘 안되는 모양이다.
아무리 봐도 뭐가 문제인지 감을 잡을 수 없었다.
다른 사람 코드를 확인해보니 내가 풀이를 고민하면서 했던 방법과 똑같은 방법으로 풀었던 사람이 있는데, 이 방법으로 풀려고 해도 잘 안되더라..
나중에 다시 시도해볼 것
+ 이항계수 식으로 코드를 작성하면 훨씬 간단하다고 한다. ( 이항계수...십년전에 봤던 기억이 있는데 가물가물... )
나의 답안 (정답)
const input = require("fs")
.readFileSync("/dev/stdin")
.toString()
.trim()
.split("\n");
const testCase = Number(input.shift());
let apt = [];
let answer = "";
for (let i = 0; i < testCase * 2; i = i + 2) {
const k = input[i]; // 1
const n = input[i + 1]; // 3
let arr = [];
for (let i = 1; i <= n; i++) {
arr.push(i);
}
apt.push(arr);
for (let i = 1; i <= k; i++) {
let sum = 0;
arr = [];
for (let j = 1; j <= n; j++) {
sum = sum + apt[i - 1][j - 1];
arr.push(sum);
}
apt.push(arr);
}
answer += apt[k][n - 1] + "\n";
// testCase 별 초기화
apt = [];
}
console.log(answer);