Code
😢 배열에 건물 크기만큼 방 번호를 저장하고 인덱스는 찾아내는 반복문도 가능했지만, 패턴과 집단을 찾는게 핵심
😊 Solution 1)
일단, 입력 받은 W는 이용하지 않아도 되는 방법으로 풀었다.
N(번째 방문자)을 H(층 높이)로 계속 빼주고, N이 H보다 작거나 같을 때 반복을 끝내보자.
그러면 N번째 방문자의 호수와 층수를 동시에 구할 수 있다.
예를 들어 N=10, H=6이라고 할 때, N = N - H;를 반복해주면 한 번만 빼줘도 10 - 6 = 4가 된다.
첫 호수 집단의 6층은 꽉 찼고, 다음 호수 집단의 4층이라는 것을 알 수 있다. (6+4=10)
동시에 roomCnt++를 진행해주면 엘리베이터에서 얼마나 떨어져 있는 호수 집단인지 알 수 있다.
위의 뺄셈은 1번 진행되며, 호수 집단은 1부터 시작한다고 선언했을 때, roomCnt++;도 역시 1번 진행되므로
2값을 얻을 수 있고, 2는 엘리베이터 기준 2번째 호수 집단이라는 것을 알 수 있다.
결과적으로 6층 각 층 객실12개 기준 10번째 손님은 402호라는 정답을 도출해낼 수 있다.
Solution 2)
N/H를 해주면 몇 번째 호수 집단인지 알아낼 수 있으며,
N%H를 해주면 몇 층인지 알아낼 수 있다.
예를 들어, N=72, H=30이라고 할 때,
N/H=2.4
1번째, 2번째도 아니고 2번째를 넘어가는 집단이라는 뜻인데 즉, 그말은 3번째 호수 집단이라는 것이다.
즉, 정수가 나오지 않는 다면 Math.ceil()을 이용해 올림을 해주면 된다.
N%H=12
즉, 30층을 2번 지난 후 12번째 층이라는 뜻이다.
층이 증가되는 패턴 그리고 호수가 증가되는 패턴을 파악하면 이렇게 N과 H만으로도 문제를 해결할 수 있다.
Solution 3)
방 배정 우선순위로 배열에 방 번호를 저장하면 된다.
중첩 for loop을 사용하며, 외부 for loop에서는 호수를 내부 for loop에서는 층수를 뽑아내면 된다.
배열에 모든 경우의 수를 저장한 후 N(or N-1)번째 배열을 출력해주면 된다.
추가적으로, 정확한 정답을 위해서 호수가 10이하면 호수 앞에 '0'을 꼭 붙여줘야 한다.
Full Code (https://github.com/DasolPark/Dasol_JS_Algorithm/tree/master/Baekjoon)
// ACM Hotel |
// 1st Solution - Good |
// For submit |
// const fs = require('fs'); |
// const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n'); |
// For local test |
const input = ['2', '6 12 10', '30 50 72']; |
const T = parseInt(input.shift()); |
for (let i = 0; i < T; i++) { |
const HWN = input[i].split(' '); |
let H = parseInt(HWN.shift()); |
HWN.shift(); |
let N = parseInt(HWN.shift()); |
let roomCnt = 1; |
while (N > H) { |
roomCnt++; |
N = N - H; |
} |
if (roomCnt < 10) { |
console.log(`${N}0${roomCnt}`); |
} else { |
console.log(`${N}${roomCnt}`); |
} |
} |
// 2nd Solution - Good |
// For submit |
// const fs = require('fs'); |
// const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n'); |
// For local test |
// const input = ['2', '6 12 10', '30 50 72']; |
// const T = Number(input.shift()); |
// for (let i = 0; i < T; i++) { |
// const HWN = input[i].split(' '); |
// let H = Number(HWN.shift()); |
// HWN.shift(); |
// let N = Number(HWN.shift()); |
// const floor = N % H === 0 ? H : N % H; |
// const roomNum = Number.isInteger(N / H) ? N / H : Math.ceil(N / H); |
// if (roomNum < 10) { |
// console.log(`${floor}0${roomNum}`); |
// } else { |
// console.log(`${floor}${roomNum}`); |
// } |
// } |
// 3rd Solution(array) - Good |
// For submit |
// const fs = require('fs'); |
// const input = fs.readFileSync('/dev/stdin').toString().trim().split('\n'); |
// For local test |
// const input = ['2', '6 12 10', '30 50 172']; |
// const T = Number(input.shift()); |
// for (let k = 0; k < T; k++) { |
// const arr = []; |
// const HWN = input[k].split(' '); |
// const H = Number(HWN[0]); |
// const W = Number(HWN[1]); |
// const N = Number(HWN[2]); |
// for (let i = 1; i <= W; i++) { |
// for (let j = 1; j <= H; j++) { |
// if (i < 10) { |
// arr.push(j + '0' + i); |
// } else { |
// arr.push(`${j}${i}`); |
// } |
// } |
// } |
// console.log(arr[N - 1]); |
// } |
'Algorithm > JavaScript(Node.js)' 카테고리의 다른 글
백준 2775번: 부녀회장이 될테야(I'll be the president of the women's association) Node.js(JavaScript) (0) | 2020.01.17 |
---|---|
Merge Sort(병합 정렬 === 병합 정렬) (0) | 2020.01.17 |
Selection Sort(선택 정렬) (0) | 2020.01.16 |
백준 2869번: 달팽이는 올라가고 싶다(The snail wants to go up) Node.js(JavaScript) (0) | 2020.01.15 |
Bubble Sort(버블 정렬) (0) | 2020.01.15 |