[JS] 백준 2775 부녀회장이 될테야

Hadam Cho·2021년 4월 23일
2

Algorithm

목록 보기
24/32

문제

평소 반상회에 참석하는 것을 좋아하는 주희는 이번 기회에 부녀회장이 되고 싶어 각 층의 사람들을 불러 모아 반상회를 주최하려고 한다.

이 아파트에 거주를 하려면 조건이 있는데, “a층의 b호에 살려면 자신의 아래(a-1)층의 1호부터 b호까지 사람들의 수의 합만큼 사람들을 데려와 살아야 한다” 는 계약 조항을 꼭 지키고 들어와야 한다.

아파트에 비어있는 집은 없고 모든 거주민들이 이 계약 조건을 지키고 왔다고 가정했을 때, 주어지는 양의 정수 k와 n에 대해 k층에 n호에는 몇 명이 살고 있는지 출력하라. 단, 아파트에는 0층부터 있고 각층에는 1호부터 있으며, 0층의 i호에는 i명이 산다.


입력

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

출력

  • 각각의 Test case에 대해서 해당 집에 거주민 수를 출력하라.

입출력 예시

2
1
3
2
3

6
10


소스 코드

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString().split('\n');
const T = Number(input.shift());

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

  // 각 방당 인원수를 저장할 2차원 배열 선언
  const house = Array.from(Array(k + 1), () => Array(n + 1).fill(0));
  // 0층 (0층의 i호에는 i명이 산다.)
  for (let i = 1; i <= n; i++) {
    house[0][i] = i;
  }
  // 1 ~ k층 (k층 n호에는 k-1층 n호 + k층 n-1호만큼 산다.)
  for (let i = 1; i <= k; i++) {
    for (let j = 1; j <= n; j++) {
      house[i][j] = house[i - 1][j] + house[i][j-1];
    }
  }

  // k층 n호의 인원수 출력
  console.log(house[k][n]);
}

느낀 점

요구 사항을 이해하는데 많은 시간을 쏟은 문제이다. 처음엔 k층 아래에 사는 모든 사람의 수만큼 살아야하는 줄 알았다. 바로 아래층의 1호부터 n호까지의 인원수만큼 데려와 살아야한다는 것이 이해가 잘 안 됐다.

문제 해결 방법이 떠오르지 않아 서치해보았는데, 인덱스 규칙을 알아내 푸는 사람들도 있었지만 문제 이해가 어려웠던 만큼 직관적으로 접근하는 해결 방법이 좋아보였다.

  1. 먼저 0층은 i호에 i명만큼 살기 때문에 n호만큼 0층을 설정해준다.
  2. k층 n호에는 k-1층 1호 ~ n호의 인원수만큼 사는데, k-1층 1호 ~ n-1호의 인원수는 k층 n-1호의 인원수와 같다. 따라서 k층 n호의 인원수는 k층 n-1호 + k-1층 n호를 해주면 된다.

참고 블로그
https://velog.io/@cada/BOJ2775-%EB%B6%80%EB%85%80%ED%9A%8C%EC%9E%A5%EC%9D%B4-%EB%90%A0%ED%85%8C%EC%95%BC

profile
(。・∀・)ノ゙

0개의 댓글