본문 바로가기
Learning-log/Algorithm 문풀

백준(파이썬, python) - 10250번 ACM호텔(2022.11.06)

by why제곱 2022. 11. 7.

1) 문제

 

2) 풀이

(1) 

import sys
 N = int(sys.stdin.readline())
 for i in range(N):
     a, b, c = map(int,sys.stdin.readline().split())
     if c%a ==0:
         y = a
         x = c//a
     else:
         y = c%a
         x = c//a + 1
     print('{}{}'.format(y,format(x,'02')))

(2)

 import sys
 N = int(sys.stdin.readline())
 for i in range(N):
     a, b, c = map(int,sys.stdin.readline().split())
     if c%a ==0:
         y = a
         x = c//a
     else:
         y = c%a
         x = c//a + 1
     print('{}{}'.format(y,format(x,'02')))

3) 문법 및 풀이과정

문제가 굉장히 길어보이지만 내용은 간단하다. 테스트 케이스 수가 입력되고, 호텔의 총 층 수(H), 한 층에 있는 호수(W), 몇 번째 손님(N)인지가 한 줄로 입력되면 가장 낮은 층의 가장 가까운 호수부터 윗층으로 차례대로 손님을 배정한 후에 층 수가 다 차면 다시 1층으로 내려와 다음 호수부터 또 윗층으로 순차적으로 배정한다. 

즉, 층수를 모듈로 하여 남는 값이 해당 손님의 층수가 되고 그 모듈이 몇 번 들어있는지를 세면 그게 호수가 되는 것이다.

(쉽게 설명하자면 층수를 나누는 수로 하여 나머지가 층수, 몫이 호수가 될 것이다.)

다만 주의할 점은 호수가 손님의 순서를 나누어 버리면(나머지가 0이면) 0층이 되어버리므로 이 때는 가장 높은 층에 배정될 수 있도록 해야한다.

그럼 풀이를 살펴보자.( 풀이 속 문자는 문제에 나온 문자 기반이 아닌, 2) 풀이에 내가 사용한 문자로 설명한다.)

 

(1) 테스트 케이스 입력값(N)을 받는다.

(2) for문을 테스트케이스 만큼 반복하고, a,b,c를 각각 입력받는다. (a = 아파트의 층수 / b = 한 층당 호수 / c = 손님의 순서)

(3) if 문을 통해 c가 a로 나누어 떨어지는 경우는 층수가 a가 되도록(최고층)하고 호수는 c를 a로 나눈 몫으로 한다.

(4) 아닐 경우는 층은 c를 a로 나눈 나머지로, 호수는 몫에서 1을 더한 값으로 한다.(1을 더한 값으로 하는 이유는 몫만큼 아파트의 층수를 최고층까지 다 채운 후, 그 옆 호수 칸부터 나머지만큼 배정될 것이기 때문이다.)

(5) 문제의 조건에 맞게 출력한다. 이 때 풀이(1)은 층수에 100을 곱한 후 호수를 더하여 출력하였고 (2)는 format함수를 활용했다.