Algorithm/BaekJoon

백준 21.12.06. 10250번 - ACM호텔

HappyFrog 2021. 12. 6. 18:29

import sys
import math

t = int(sys.stdin.readline())

for _ in range(0, T):
    h, w, n = map(int, sys.stdin.readline().split())
    roomNumber = math.ceil(n/h)

    if n%h == 0:
        floor = h
    else:
        floor = n%h

    print(str(floor) + str(roomNumber).zfill(2))
  • 우선 연산속도를 줄이기 위한 sys모듈과 ceil(소수점 올림처리)을 사용하기 위해 임포트해줍니다.
  • 그리고 연산을 몇 회 돌릴건지 입력받기 위한 t를 작성하고 t만큼 실행할 수 있도록 반복문을 작성해줍니다.
  • 반복문 내에서는 문제의 내용을 작성해줍니다. 우선 높이(h), 너비(w), 손님의 수(n)를 입력받을 수 있도록 작성해줍니다.
  • 그리고 문제의 내용대로라면 손님들은 (101)부터 시작해서 (h01)번까지 차례대로 들어간 후 102에 들어가는 식으로 왼쪽 세로줄의 아래부터 위로 차례대로 채워갈 것입니다.
    • 따라서 방번호는 손님 수를 높이로 나눈 값의 올림처리를 하면 구할 수 있습니다.
  • 다음으로는 층을 구해야하는데, 이것은 나머지를 이용해 구하면 됩니다. 
    • 6층건물의 10번째 손님이라면 "10%6 = 4"이므로 4층에 머무는 상태가 됩니다.
    • 하지만 여기서 예외가 발생하는데, 나머지가 없이 딱 딸어지는 값이라면 손님은 가장 높은 층에 머물고 있다는 점입니다. (6번째손님은 6층에 묵습니다. => 6%6 = 0)
    • 따라서 분기를 나누어 나머지가 0이라면 최고층의 수를 출력하도록 예외처리를 해주면 됩니다.
  • 마지막으로 층계와 방 번호를 구했으니 둘을 str형식으로 형변환 시켜줍니다.
    • 여기서 방 번호는 102, 103 ... 113 이런식으로 진행되기 때문에 str의 zfill함수를 사용해줍니다.
    • str(roomNumber).zfill(2)는 모자란 자리에 0을 넣어값을 두자리 수로 표현한다는 뜻입니다.
      • 1 => 01, 2 => 02, 11 => 11...