✏️기록하는 즐거움
article thumbnail

Link

 

10250번: ACM 호텔

프로그램은 표준 입력에서 입력 데이터를 받는다. 프로그램의 입력은 T 개의 테스트 데이터로 이루어져 있는데 T 는 입력의 맨 첫 줄에 주어진다. 각 테스트 데이터는 한 행으로서 H, W, N, 세 정수

www.acmicpc.net

문제

입력

프로그램은 표준 입력에서 입력 데이터를 받는다. 프로그램의 입력은 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()을 사용하기
 

[백준] 2869: 달팽이는 올라가고 싶다 (javascript)

Link 2869번: 달팽이는 올라가고 싶다 첫째 줄에 세 정수 A, B, V가 공백으로 구분되어서 주어진다. (1 ≤ B < A ≤ V ≤ 1,000,000,000) www.acmicpc.net 문제 땅 위에 달팽이가 있다. 이 달팽이는 높이가 V미터..

codingmyoni.tistory.com


Comment

마지막에 제출한 것이 리팩토링 전의 코드 !!

조건식의 Math.ceil()이 문제일 것이라고 생각도 못해서 정답을 맞추고서 꽤나 벙쪘다

이것때문에 이렇게 고생하다니ㅠㅠㅠㅠ

 

profile

✏️기록하는 즐거움

@nor_coding

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!