알고리즘

백준 JS | 2775번 부녀회장이 될테야

3jun 2022. 5. 26. 17:38
출처: 백준 온라인저지

https://www.acmicpc.net/problem/2775

 

2775번: 부녀회장이 될테야

첫 번째 줄에 Test case의 수 T가 주어진다. 그리고 각각의 케이스마다 입력으로 첫 번째 줄에 정수 k, 두 번째 줄에 정수 n이 주어진다

www.acmicpc.net

문제

“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가 한번 더 출력되었다..

여기서부터 틀렸음을 직감...

테스트 케이스에 대해서는 답이 나오지만, 테스트 케이스를 한가지 더 추가했으나 원치않는 콘솔들이 연이어 찍히고 문제를 제출하니 시간초과 ㅠㅠ

 

아직도 테스트 케이스에 매몰되서 코드를 짜지 않으려고 노력 중인데 생각만큼 잘 안되는 모양이다.

아무리 봐도 뭐가 문제인지 감을 잡을 수 없었다.

 

다른 사람 코드를 확인해보니 내가 풀이를 고민하면서 했던 방법과 똑같은 방법으로 풀었던 사람이 있는데, 이 방법으로 풀려고 해도 잘 안되더라..

나중에 다시 시도해볼 것

 

백준 2775번 부녀회장이 될테야-JS

귀여운 이름에 그와 안어울리게 머리 아프게 하던 문제. 처음에 규칙은 음ㅇㅋ근데 이걸 어케 구현하지...? 이러면서 와안전 뻘짓 하다가 드디어 규칙을 구현하는 코드가 생각남!아니 앞에거를

velog.io

+ 이항계수 식으로 코드를 작성하면 훨씬 간단하다고 한다. ( 이항계수...십년전에 봤던 기억이 있는데 가물가물... ) 

 

백준 2775번 : 부녀회장이 될테야 | SJ_

백준 2775번 : 부녀회장이 될테야 2021년 10월 20일 수요일 #문제 평소 반상회에 참석하는 것을 좋아하는 주희는 이번 기회에 부녀회장이 되고 싶어 각 층의 사람들을 불러 모아 반상회를 주최하려

seokjun.gatsbyjs.io

나의 답안 (정답)

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);