| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
- Javascript
- 자바스크립트 일급객체
- 11047 node.js
- 21313 nodejs
- 11399 node.js
- IT5분잡학사전
- 모던자바스크립트
- 1026 node.js
- 개인프로젝트
- 백준1026
- 자바스크립트 딥다이브
- 1931 node.js
- 자바스크립트 함수
- 코딩
- 1541 node.js
- 모던자바스크립트DeepDive
- 개발자
- 백준25176
- 14655 nodejs
- 백준21313
- 1789 node.js
- 노마드스터디
- 모던자바스크립트 딥다이브
- 노마드북클럽
- flex box
- 노개북
- 백준1789
- 2217 node.js
- const
- CSS flex
- Today
- Total
캐또's coding
2775 - 부녀회장이 될테야 - node.js 본문
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 값에 해당하는 결과를 출력해주면 문제 해결
'기초 공부 > 백준 문제 풀이' 카테고리의 다른 글
| 10757 - 큰 수 A+B - node.js (0) | 2022.08.28 |
|---|---|
| 2839 - 설탕 배달 - node.js (0) | 2022.08.28 |
| 10250 - ACM 호텔 - node.js (0) | 2022.08.25 |
| 2869 - 달팽이는 올라가고 싶다 - node.js (0) | 2022.08.24 |
| 1193 - 분수찾기 - node.js (0) | 2022.08.24 |