프로그램은 표준 입력에서 입력 데이터를 받는다. 프로그램의 입력은 T 개의 테스트 데이터로 이루어져 있는데 T 는 입력의 맨 첫 줄에 주어진다. 각 테스트 데이터는 한 행으로서 H, W, N, 세 정수를 포함하고 있으며 각각 호텔의 층 수, 각 층의 방 수, 몇 번째 손님인지를 나타낸다(1 ≤ H, W ≤ 99, 1 ≤ N ≤ H × W).
프로그램은 표준 출력에 출력한다. 각 테스트 데이터마다 정확히 한 행을 출력하는데, 내용은 N 번째 손님에게 배정되어야 하는 방 번호를 출력한다.
2
6 12 10
30 50 72
402
1203
console.log(require('fs').readFileSync('/dev/stdin').toString().trim().split('\n').splice(1).map(e=>{
const [h,w,n]=e.split(' ');
const floor=n%h;
const room=String(Math.ceil(n/h)).padStart(2,'0');
return `${floor!==0?floor:h}${room}`
}).join('\n'));
처음 호수를 표현할 때 1호 => 01호, 12호 => 12호 이런식으로 표현하기 위해 호수를 0.01을 곱해 소수로 만든 후 소수점 부분만 취하는 방식으로 접근했었다.
const room=String(((Math.ceil(n/h))*0.01).toFixed(2)).split('.')[1];
하지만 이 문제처럼 원하는 자리수에 경우에 따라 문자를 더해주는 방식은 자주 쓰이는 데, 그 때마다 이렇게 곱하고 나누고 하는 게 최선일까 생각돼 좀더 검색해보았고, 그 결과 아주 유용한 문자열 메소드를 찾을 수 있었다. 바로 padStart와 padEnd이다.
padStart() 메서드는 현재 문자열의 시작을 다른 문자열로 채워, 주어진 길이를 만족하는 새로운 문자열을 반환한다. 채워넣기는 대상 문자열의 시작(좌측)부터 적용된다.
'abc'.padStart(10); // " abc"
'abc'.padStart(10, "foo"); // "foofoofabc"
'abc'.padStart(6,"123465"); // "123abc"
'abc'.padStart(8, "0"); // "00000abc"
'abc'.padStart(1); // "abc"
padStart와 동일한데 padEnd는 대상 문자열의 우측(끝)부터 채워넣는다는 차이가 있다.