관리 메뉴

나만을 위한 블로그

[Algorithm] 백준 - ACM 호텔 (10250) (Kotlin) 본문

알고리즘 문제 풀이/백준

[Algorithm] 백준 - ACM 호텔 (10250) (Kotlin)

참깨빵위에참깨빵 2024. 7. 6. 20:38
728x90
반응형

 
아래는 전체 코드다.
 

fun main() {
    val t = readln().toInt()
    repeat(t) {
        val (h, w, n) = readln().split(" ").map { it.toInt() }
        val floor = if (n % h == 0) h else n % h
        val room = if (n % h == 0) n / h else n / h + 1

        println("$floor${String.format("%02d", room)}")
    }
}

 
문제의 조건은 아래와 같다.
 

  • 각 층 왼쪽부터 차례대로 방이 있고 모두 비어있는 상태다
  • 손님은 1층부터 위쪽으로 방이 배정된다 (101 -> 201 -> 301 순)
  • 각 층이 모두 차면 그 다음 방 번호로 넘어간다 (6층이 최상층인 경우 101 -> 201 -> ... -> 601 -> 102 -> 202 순)

 
6층 건물에 10번째 손님이 왔다면 이 손님에게 배정될 방은 10 % 6 = 4층이다.
왜냐면 6층 건물이라면 6번째 손님이 601호를 배정받으면서 각 층별 1번째 방은 모두 배정된 상태가 된다. 그러면 다시 102호부터 한 층씩 올라가야 6번째 손님 이후로 오는 손님들이 몇 층에 배정될지 알 수 있다.
그래서 %를 사용해 나머지를 구하면 6 + n번 손님이 몇 층에 배정될지 알 수 있다.
 
방 번호의 경우 (10 / 6) + 1 = 2번째 방을 배정받아야 한다.
왜냐면 앞서 말한대로 1번째 방은 이미 모두 배정됐다. 이 상태에서 중복 배정될 수는 없기 때문에 1을 더해서 그 다음 방을 배정해야 한다.
그래서 나머지 연산이 아니라 나누기 연산으로 구한 몫에 1을 더하면 결과적으로 402호를 배정받게 된다.
 
다른 예를 확인한다. h = 30, w = 50, n = 72인 경우 72번 손님이 배정받을 방 번호를 구하면 아래와 같다
 

  • 층 : 72 % 30 = 12층
  • 방 번호 : 72 / 30 + 1 = 3번째 방
  • 1203호를 배정받는다

 
그러나 출력하는 건 다른 문제다. 각 예시에서 구한 숫자는 4와 2, 12와 3인데 두 숫자를 그냥 이어붙이면 42, 123이 되서 호텔 방 넘버링과는 맞지 않기 때문이다.
층 수는 무시하고 방 번호가 1자리 수인 경우만 고려하면 되기 때문에 String.format()을 써서 출력한다. 그러면 402, 1203과 같이 출력되서 문제를 통과할 수 있다.

반응형
Comments