백준/C++

[백준] 10250번: ACM 호텔 | C++ 풀이

성실한 당근농부 2023. 6. 25. 23:14

# 문제

여러분이 작성할 프로그램은 초기에 모든 방이 비어있다고 가정하에 이 정책에 따라 N 번째로 도착한 손님에게 배정될 방 번호를 계산하는 프로그램이다. 첫 번째 손님은 101 호, 두 번째 손님은 201 호 등과 같이 배정한다. 그림 1 의 경우를 예로 들면, H = 6이므로 10 번째 손님은 402 호에 배정해야 한다.

 

 


 

# 풀이

복잡해보이지만 천천히 뜯어보면 어렵지 않은 문제다.

정답 소스코드를 확인하기 전, 방이 어떤 순서로 배정되는지 살펴보자.

손님의 선호에 관한 정보는 다음과 같다.

손님은 엘리베이터를 타고 이동하는 거리는 신경 쓰지 않는다. 다만 걷는 거리가 같을 때에는 아래층의 방을 더 선호한다. 예를 들면 102 호 방보다는 301 호 방을 더 선호하는데, 102 호는 거리 2 만큼 걸어야 하지만 301 호는 거리 1 만큼만 걸으면 되기 때문이다. 같은 이유로 102 호보다 2101 호를 더 선호한다.

 

 

따라서 위의 그림과 같은 순서로 엘리베이터와 가까운 곳에서부터 배정이 이루어지고, 층수를 먼저 증가시킨 후 최고층에 다다르면 다음 열로 넘어가 다시 1층부터 배정하는 식이다.

 

이 순서만 확인했다면 풀이는 금방이다. 이제 정답 소스코드를 확인해보자!

 

#include <iostream>
using namespace std;

int main(){
    ios_base::sync_with_stdio(false);	// 두 표준 입출력 동기화 해제
    cin.tie(NULL);	// 입력과 출력 묶음을 풀기
    
    int testCase, h, w, n;
    cin >> testCase;
    
    while(testCase--){
        cin >> h >> w >> n;
        int num = 1;
        while(n > h){
            n -= h;
            num++;
        }
        cout << n*100 + num << '\n';
    }
    return 0;
}

우선 테스트 케이스의 개수를 입력받아 while문을 돌려주고, 그 안에서 건물의 정보와 몇 번째 손님인지를 받아온다. 그 다음 손님의 순서와 층 수를 비교하며 층 수와 방 번호 정보를 정해줄 거다.

방 번호는 1부터 시작하므로 num 변수를 만들어 1로 초기화 해준다.

 

내부 while문의 로직은 다음과 같다.

만약 예시와 같이 H = 6, W = 12, n = 10 이라면, 이 손님은 적어도 첫번째 열에는 머물지 않는다. 이미 6명의 손님이 101 ~ 601 에 해당하는 곳에 머물고 있기 때문이다. 따라서 while 조건문에 해당하는 경우에는 n에서 h만큼 빼주며 위치를 조정해준다. 이 과정에서 옆 열로 넘어가고, 방 수 정보를 업데이트 하게 된다. (num++)

예시의 경우에는 10-6 = 4 가 되어 옆 열로 넘어갔고, 두번째 열이므로 해당 열의 방 번호는 모두 2다.

따라서 방 번호 변수인 num을 하나 증가시킨다. 그 후 while문을 벗어나게 되는데 이때 남아있는 n과 num이 층 수와 방 번호 정보이다. (두번째 열에서 4번째 층에 위치하게 됨 n = 4, num = 2)

 

몇 번째 층의 몇 번째 방인지는 확정되었으니 배정될 방 번호만 잘 출력해주면 된다. 방 번호의 형식은 YXX, YYXX과 같으므로 층 정보를 담고 있는 n에 100을 곱하고, 방 정보를 담고 있는 num과 더해 출력하면 끝이다! 

 

 

 

 

 


 

 

 

10250번: ACM 호텔

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

www.acmicpc.net

 

728x90