Coding/BOJ
[BOJ 백준] 10250 - ACM 호텔 (C++ / Python)
Dev_Klare
2023. 11. 11. 21:30
문제 바로가기
https://www.acmicpc.net/problem/10250
관련 알고리즘
- 수학
정답 및 해설
가장 좌측열부터 호텔 손님에게 방을 배정하는 문제이다.
가장 아래층 1호부터 가장 위층 1호방이 다 찼을 경우, 그 때 다음 호수(2호) 가장 아래층부터 배정하는 순서이다.
알고리즘 칸에 '수학'으로 기재해두었는데, 해당 문제의 경우 간단한 나머지 계산으로 정답을 구할 수 있다.
층수는 N%H (나머지)로, 호수는 N/H의 정수부(몫)로 나타낼 수 있기 때문이다.
예를 들어 H=3, W=4인 호텔의 10번째 방 : 층수 = 10%3 = 1, 호수 = (10/3)+1 = 4 즉, 104호이다.
301 (3) | 302 (6) | 303 (9) | 304 (12) |
201 (2) | 202 (5) | 203 (8) | 204 (11) |
101 (1) | 102 (4) | 103 (7) | 104 (10) |
반례
더보기
N이 H로 나누어 떨어지는 경우 반례가 발생할 수 있다.
다음 입력을 살펴보자.
1
3 4 6
H=3, W=4인 호텔의 6번째 방의 경우, 층수는 6%3=0, 호수는 (6/3)+1=3 즉, 003호를 출력하게 된다.
실제 정답은 302호인데, 이를 해결하기 위해서는 N%H가 0일 경우 예외를 계산해주어야한다.
만약 N%H==0 이라면 이전 호수 맨위층에 배정돼야 하므로 층수=H, 호수-=1을 해주어 302호를 출력하도록 한다.
C++
더보기
#include<iostream>
using namespace std;
int main(){
int T,H,W,N,F,R;
cin>>T;
while(T--){
cin>>H>>W>>N;
F=N%H;
R=N/H+1;
if(F==0){
F=H; R--;
}
cout<<F*100+R<<'\n';
}
}
Line | 해설 |
4~6 | 변수를 선언하고 테스트 케이스의 개수(T)를 입력받은 후, while 문으로 T번 만큼 반복문을 실행한다. int F : 정답 방의 층수 / int R : 정답 방의 호수 |
7~9 | 호텔의 정보와 몇번째방(N)인지를 입력받는다. 정답 방의 층수(F)는 N을 H로 나눈 나머지로, 호수(H)는 N을 H로 나눈 몫+1로 한다. |
10~12 | 예외를 처리해준다. F가 0일 경우 예외가 발생하기 때문에 F=H; R--; 를 통해 이전 호수 가장 위층으로 배정해야 한다. |
13 | F*100+R로 층과 호수를 종합하여 방 호수 형태로 출력한다. ex) F=3, R=1인 경우 301호 |
Python
더보기
T=int(input())
for _ in range(T):
H,W,N=map(int,input().split())
F=N%H
R=N//H+1
if F==0:
F=H
R-=1
print(F*100+R)
Line | 해설 |
1~2 | 테스트케이스의 개수(T)를 입력받고 for문을 통해 T만큼 반복하여 실행한다. |
3 | 변수 H,W,N를 입력받고 map 함수를 통해 정수형으로 형변환을 해준다.1) |
4~5 | 정답 방의 층수(F)는 N을 H로 나눈 나머지로, 호수(H)는 N을 H로 나눈 몫+1로 한다. |
6~8 | 예외를 처리해준다. F가 0일 경우 예외가 발생하기 때문에 F=H과 R-=1 를 통해 이전 호수 가장 위층으로 배정해야 한다. |
9 | F*100+R로 층과 호수를 종합하여 방 호수 형태로 출력한다. ex) F=3, R=1인 경우 301호 |
1) map 함수는 map(함수, 튜플/리스트) 형식으로 입력받아 튜플 혹은 리스트의 각 요소에 입력한 함수를 적용시키는 함수이다. map(int, input.split())을 통해 input()으로 입력받은 문자열을 split()으로 공백을 기준으로 분리한 뒤,
map함수를 이용하여 분리된 각 문자에 int 함수를 적용하여 정수로 변환하였다.