BOJ 10250. ACM 호텔 (Python)

2021. 2. 10. 00:45Problem Solving/BOJ

BOJ 10250. ACM 호텔

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

 

10250번: ACM 호텔

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

www.acmicpc.net

Logic

예를 들면 102 호 방보다는 301 호 방을 더 선호하는데, 102 호는 거리 2 만큼 걸어야 하지만 301 호는 거리 1 만큼만 걸으면 되기 때문이다. 같은 이유로 102 호보다 2101 호를 더 선호한다.

 

엘리베이터로 이동하는 거리는 무시한다고 했다. 그러면 방이 배정되는 순서는 101, 201, 301, 401,,, 다음은 102, 202, 302,, 이렇게 될 것이다.

왜냐? Y01호들은 모두 이동거리가 1이다. 엘리베이터로 이동하는거리는 무시하니까. 그렇다면 이동거리가 1인 방부터 배정해야 한다. 걷는 거리가 같을 때에는 아래층의 방을 더 선호하기 때문에 아래부터 배정한다.

그럼 이렇게 된다. (H가 10일때.)

 

image

H=6, N=10일땐 6번째 손님까지 Y01호에 채우고, 그다음 7번째 손님은 102, 8번째는 202, 9번째는 302, 10번째는 402이므로 답은 402가 되겠다.

그리고 여기서 W는 전혀.. 신경 쓸 필요가 없다.

 

여기까지 하면 눈치를 챌것인데, 호수는 층수 + 엘베부터 거리 이렇게 구성되어 있으니

호수 = (N나누기 H의 나머지) + (몫 + 1)

이 된다.

q = N // H # 몫
c = N % H # 나머지

print(c*100 + q+1)

주의 할 점은 나머지가 0일때, 즉 높이 H와 몇번째 손님 N이 같을때, 최상위 층에 손님이 머물게 되는데 이때 호수는 H층H호 이므로 나머지0을 H로 바꿔준다.

또한 나머지가 0일때, 손님은 꼭대기 층에 배정받으니 다음 줄로 넘어가지 않는다. 그래서 q-1을 해준다. (마지막에 q+1 해주어 print하기 때문에 미리 -1 하여 증가하지 않게 해주는 것)

if c == 0:
    c = H
    q -= 1

Solution

import sys

T = int(input())
for _ in range(0, T):
    H, W, N = map(int, sys.stdin.readline().split())
    # 방 호수는 "나머지 + 몫+1" 로 구성됨
    q = N // H
    c = N % H

    # 맨 꼭대기 층일때, 나누어 떨어질때
    if c == 0:
        c = H
        q -= 1

    print(c*100 + q+1)

아래가 sys.stdin.readline()으로 입력 받은 것 / 위는 동일한 코드에 input() 사용

 

input 받을 때 sys.stdin.readline()을 사용하면 시간을 좀 줄일 수 있다. 이에 대한 내용은

 

[Python] input()과 sys.stdin

 

에 있다.

반응형

'Problem Solving > BOJ' 카테고리의 다른 글

BOJ 2798. 블랙잭 (Python)  (0) 2021.02.10
BOJ 1259. 팰린드롬 수 (Python)  (0) 2021.02.10
BOJ 1085. 직사각형에서 탈출 (Python)  (0) 2021.02.09
BOJ 10818. 숫자의 합(Python)  (0) 2021.02.07
BOJ 11729. 숫자의 합(Python)  (0) 2021.02.07