[백준 문제풀이] 2775 부녀회장이 될테야

방예서·2022년 6월 2일
0

코딩테스트 준비

목록 보기
13/37

2775 부녀회장이 될테야

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

  • 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차원 배열 초기화 선언을 하지 않고 배열을 만들어서 배열에 넣고 ... 이런 과정으로 진행하려다가 훨씬 복잡해지는 것 같아서 이 방법을 선택했다...

중첩 반복문을 사용해야하는 경우 복잡하게 생각이 되고 코드 작성이 더 힘들어진다는 것을 뼈저리게 느꼈다.

profile
console.log('bang log');

0개의 댓글