Link
문제
입력
프로그램은 표준 입력에서 입력 데이터를 받는다. 프로그램의 입력은 T 개의 테스트 데이터로 이루어져 있는데
T 는 입력의 맨 첫 줄에 주어진다. 각 테스트 데이터는 한 행으로서 H, W, N, 세 정수를 포함하고 있으며 각각 호텔의 층 수, 각 층의 방 수, 몇 번째 손님인지를 나타낸다(1 ≤ H, W ≤ 99, 1 ≤ N ≤ H × W).출력
프로그램은 표준 출력에 출력한다. 각 테스트 데이터마다 정확히 한 행을 출력하는데, 내용은 N 번째 손님에게 배정되어야 하는 방 번호를 출력한다.
| 예제 입력
2
6 12 10
30 50 72
| 예제 출력
402
1203
제출
const input = (
process.platform == "linux"
? require("fs").readFileSync("/dev/stdin").toString()
: `2
6 12 10
30 50 72`
).split("\n");
const T = input[0];
for (let i = 1; i <= T; i++) {
let [H, W, N] = input[i].trim().split(" ").map(Number);
let Y = N % H === 0 ? H : N % H;
let X = Math.ceil(N / H);
X < 10 ? console.log(`${Y}0${X}`) : console.log(`${Y}${X}`);
}
풀이과정
조건 (1). 방 번호는 YXX나 YYXX 형태
- 202호, 512호는 YXX 형태
- 1201호, 2310호는 YYXX 형태
조건 (2). 정문과 가까운 방을 선호하고, 걷는 거리가 같을 때는 아래층의 방을 선호한다.
- 102호 방보다는 301호 방을, 206호 방보다는 106호 방을 더 선호한다.
문제에서 주어진 예시와 같이 접근하면 로직을 쉽게 생각할 수 있다.
H = 6 일때, 10번째 손님은 402호에 배정해야한다
H를 10으로 나눈 나머지가 층수가 되고, 몫을 올림한 값이 호수가 된다.
H(6) / 10을 했을 때 1.6666...의 값이 나오게 되므로 나머지 손님을 배정하기 위해서는 하나의 호수를 더 사용해야한다.
따라서 몫을 호수로 하지 않고 올림을 해주어야한다.
여기서 주의할 점은 호수가 10보다 작을 땐 앞에 '0'을 추가로 덧붙여야 한다는 점!
Try 1 - 실패 )
const input = (
process.platform == "linux"
? require("fs").readFileSync("/dev/stdin").toString()
: `2
6 12 10
30 50 72`
).split("\n");
const T = input[0];
for (let i = 1; i <= T; i++) {
let [H, W, N] = input[i].trim().split(" ").map(Number);
let Y = N % H === 0 ? H : N % H;
let X = N / H < 10 ? `0${Math.ceil(N / H)}` : Math.ceil(N / H);
console.log(`${Y}${X}`);
🔼 호수가 10보다 작을 경우를 비교했을 때 Math.ceil()을 사용한 값이 아닌 N / H로 비교했을 때, 오답처리가 되었다.
Try 2 - 정답 )
const input = (
process.platform == "linux"
? require("fs").readFileSync("/dev/stdin").toString()
: `2
6 12 10
30 50 72`
).split("\n");
const T = input[0];
for (let i = 1; i <= T; i++) {
let [H, W, N] = input[i].trim().split(" ").map(Number);
let Y = N % H === 0 ? H : N % H;
let X = Math.ceil(N / H) < 10 ? `0${Math.ceil(N / H)}` : Math.ceil(N / H);
console.log(`${Y}${X}`);
}
🔼 삼항연산자의 조건문에 Math.ceil을 사용하니 정답이었다.
Final - 정답 )
const input = (
process.platform == "linux"
? require("fs").readFileSync("/dev/stdin").toString()
: `2
6 12 10
30 50 72`
).split("\n");
const T = input[0];
for (let i = 1; i <= T; i++) {
let [H, W, N] = input[i].trim().split(" ").map(Number);
let Y = N % H === 0 ? H : N % H;
let X = Math.ceil(N / H);
X < 10 ? console.log(`${Y}0${X}`) : console.log(`${Y}${X}`);
}
🔼 코드 정리
개념
Math.ceil()
- 이전 문제에서 사용했던 Math.ceil()을 사용하기
Comment
마지막에 제출한 것이 리팩토링 전의 코드 !!
조건식의 Math.ceil()이 문제일 것이라고 생각도 못해서 정답을 맞추고서 꽤나 벙쪘다
이것때문에 이렇게 고생하다니ㅠㅠㅠㅠ
'Algorithm > Baekjoon' 카테고리의 다른 글
[백준] 2839: 설탕 배달 (javascript) (0) | 2022.07.07 |
---|---|
[백준] 2775: 부녀회장이 될테야 (javascript) (0) | 2022.07.07 |
[백준] 2869: 달팽이는 올라가고 싶다 (javascript) (0) | 2022.07.06 |
[백준] 1193: 분수찾기 (javascript) (0) | 2022.07.06 |
[백준] 2292: 벌집 (javascript) (0) | 2022.07.06 |