캐또's coding

2775 - 부녀회장이 될테야 - node.js 본문

기초 공부/백준 문제 풀이

2775 - 부녀회장이 될테야 - node.js

JS_K_coding 2022. 8. 27. 11:03

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

 

2775번: 부녀회장이 될테야

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

www.acmicpc.net


층수를 나타내는 입력 k, 호수를 나타내는 n이 주어진다. 아파트는 0층 1호부터 시작한다. 층에 들어오는 인원에 규칙이 있는데, 특정 호수의 인원은 그 층 -1층의 1부터 b까지 인원의 합만큼 살아야 한다는 것이다. 백준 문제에서 설명한 방식 그대로 그림으로 나타내보자면 아래와 같다.

             
             
      = 여기 인원      
여기부터 ~ ~ 여기의 합      
             
             
             

 

이를 활용하여 다르게 보자면 아래와 같이 볼 수도 있을 것이다.

             
             
    여기 인원 +  = 여기 인원      
      여기 인원       
             
             
             

즉, 입력으로는 층수 k와 호수 n이 들어오게 되는데, 다음의 1, 2가 성립 가능할 것이다.

※ (k는 1보타 크거나 같은 값이며 n은 14보다 작거나 같은 값)

1. k층 n호에 사는 사람의 수는 k-1층 1호부터 k-1층 n호까지의 인원의 합과 같다.

2. k층 n호에 사는 사람의 수는 k층 n-1호 + k-1층 n호의 인원의 수와 같다.

 

실제 수를 넣은 예시를 통해 다시 보자면,

1 5 15 35
1 4 10 20
1 3 6 10
1 2 3 4

여기서 2층 3호를 예로 살펴보자. 2층 3호에는 10명이 살고 있다.

※ 층은 0층부터 시작한다고 쓰여 있다. 따라서 10명이 사는 층은 3층이 아니라 2층이 맞다.

 

1. k층 n호에 사는 사람의 수는 k-1층 1호부터 k-1층 n호까지의 인원의 합과 같다.

= 2층 3호에 사는 사람의 수는 1층 1호부터 1층 3호까지의 인원의 합과 같다. =1명+3명+6명 = 10명

2. k층 n호에 사는 사람의 수는 k층 n-1호 + k-1층 n호의 인원의 수와 같다.

= 2층 3호에 사는 사람의 수는 2층 2호 + 1층 3호의 인원의 수와 같다 = 4명 + 6명 = 10명

 

const input = require("fs").readFileSync("/dev/stdin").toString().trim().split("\n").map(Number);
const testCaseCount = input.shift();

for (let i = 0; i < testCaseCount; i++) {
  const k = input.shift();
  const n = input.shift();

  const resultArr = [];

  for (let i = 0; i <= k; i++) {
    resultArr.push([1]);
    for (let j = 1; j < n; j++) {
      if (i == 0) {
        resultArr[i].push(j + 1);
      } else {
        resultArr[i].push(resultArr[i][j - 1] + resultArr[i - 1][j]);
      }
    }
  }
  const floor = k;
  const room = n - 1;
  console.log(resultArr[floor][room]);
}

입력값을 받아오는 과정은 지금까지 있었던 것과 크게 다르지 않다. \n으로 줄마다 구분하고 .map(Number)로 모든 값을 숫자형으로 확실히 바꿔준다.

 

input array에 있는 값들을 이용하는 방법에서 이번에는 shift만을 이용했는데, 이전에도 이용했을 때 알아봤던 바와 같이 shift는 가장 앞에 있는 값을 빼준다. 그리고 본래의 array에는 가장 앞의 값이 빠진 상태가 된다.

 

testCaseCount에는 가장 첫 번째 값 즉, 테스트케이스의 갯수가 저장된다.

다음은 for 문을 돌면서 k에는 input에서 1 index의 값이 n에는 input에서 2 index의 값이 들어올 것이다. k에서 shift했으므로 가장 앞의 값이 빠지고 n에서도 마찬가지, 인덱스를 짝수번 홀수번으로 그러니까 i % 2 == 0 이런 방식을 활용하는 것도 찾아볼 수 있었지만 shift를 사용하는 방법이 가장 직관적이고 빠른 코드 작성에 도움이 되는 것으로 보였다.

 

다음으로는 빈 array 하나를 할당한다. 이제 for문을 돌면서 위에서 살펴봤던 것과 마찬가지로 실제 array를 통해 아파트의 모습을 그려나가면 된다. 0층은 i이므로 1의 값을 할당하고 그 외의 경우에는 위에서 언급한 공식을 적용해서 resultArr[i][j-1] + resultArr[i-1][j]를 넣어주면 된다.

 

이제 아파트의 모습이 resultArr에 담겼을 것이고 k와 n 값에 해당하는 결과를 출력해주면 문제 해결

 

Comments