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 함수를 적용하여 정수로 변환하였다.