ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 10250번 ACM 호텔
    알고리즘 2022. 5. 9. 21:57

    출처 링크:

    https://www.acmicpc.net/problem/10250

     

     

    ACM 호텔 매니저 지우는 손님이 도착하는 대로 빈 방을 배정하고 있다. 고객 설문조사에 따르면 손님들은 호텔 정문으로부터 걸어서 가장 짧은 거리에 있는 방을 선호한다고 한다. 여러분은 지우를 도와 줄 프로그램을 작성하고자 한다. 즉 설문조사 결과 대로 호텔 정문으로부터 걷는 거리가 가장 짧도록 방을 배정하는 프로그램을 작성하고자 한다.

    문제를 단순화하기 위해서 호텔은 직사각형 모양이라고 가정하자. 각 층에 W 개의 방이 있는 H 층 건물이라고 가정하자 (1 ≤ H, W ≤ 99). 그리고 엘리베이터는 가장 왼쪽에 있다고 가정하자(그림 1 참고). 이런 형태의 호텔을 H × W 형태 호텔이라고 부른다. 호텔 정문은 일층 엘리베이터 바로 앞에 있는데, 정문에서 엘리베이터까지의 거리는 무시한다. 또 모든 인접한 두 방 사이의 거리는 같은 거리(거리 1)라고 가정하고 호텔의 정면 쪽에만 방이 있다고 가정한다.

     

    다시 풀어본 풀이

     

    const input = require("fs").readFileSync("/dev/stdin").toString().split("\n");
                                           
    let nAnswer = ""
    for(let row = 1 ; row <= input[0]/1 ; row++) {
        
        let h = input[row].split(' ')[0]/1
        let w = input[row].split(' ')[1]/1
        let n = input[row].split(' ')[2]/1
        let j = 0
        let t = 1
        let answer = 0
    
        for (let i = 1 ; i <= n ; i++) {
      
          if(h < j) {
            t++
            j = 1
          }
          j++
        }
    
        if(t < 10) {
    
        answer = j.toString() + '0' + t.toString()
        } else {
          answer = j.toString() + t.toString()
        }
    nAnswer += answer + "\n"
    }
    console.log(nAnswer)

    분명 맞게 작성한 듯 한데 왜 런타임 에러도 아닌 '틀렸습니다'가 나오는지 모르겠다.

     

    고민하고 생각해본 결과 j++의 위치를 바꾸어야 했다.

    그렇지 않으면 H가 6, W가 12일 때 N이 7인 경우는 102호가 나와야 하지만 위 대로라면 701이 나오게 된다.

    따라서 다음과 같이 코드를 수정하니 제출했을 때 정답처리되었다.

     

    const input = require("fs").readFileSync("/dev/stdin").toString().trim().split("\n");
                                           
    let nAnswer = ""
    for(let row = 1 ; row <= input[0]/1 ; row++) {
        
        let h = input[row].split(' ')[0]/1
        let w = input[row].split(' ')[1]/1
        let n = input[row].split(' ')[2]/1
        let j = 0
        let t = 1
        let answer = 0
    
        for (let i = 1 ; i <= n ; i++) {
            j++
          if(h < j) {
            t++
            j = 1
          }
        }
    
        if(t < 10) {
    
        answer = j.toString() + '0' + t.toString()
        } else {
          answer = j.toString() + t.toString()
        }
        nAnswer += answer + "\n"
    }
    console.log(nAnswer)

    매우 신난다 :)

     

    이전에 제출한 답과는 또 다른 코드를 짜낸 것에 만족한다.

     

    참고로 이전에 제출한 코드는 아래와 같으며 다른 분의 풀이를 참고한 것이다.

    근본적인 로직 자체는 차이가 거의 없는 것 같다.

     

    const fs = require("fs");
    const [n, ...arr] = (
      process.platform === "linux"
        ? fs.readFileSync("/dev/stdin").toString()
        : `2
    6 12 10
    30 50 72`
    )
      .trim()
      .split("\n");
    
    let nArrNumber = Number(n);
    let newArr = arr.map((e) => e.split(" "));
    let nAnswer = "";
    
    for (let i = 0; i < nArrNumber; i++) {
      let H = newArr[i][0],
        N = newArr[i][2];
    
      let answerH = N % H;
      if (answerH === 0) {
        answerH = H;
      }
    
      let answerW = Math.ceil(N / H);
      answerW < 10 ? (answerW = String(0) + answerW) : answerW;
    
      nAnswer += `${answerH}${answerW}` + "\n";
    }
    
    console.log(nAnswer);
Designed by Tistory.