본문 바로가기

코딩/백준 BOJ

[백준/C언어] 10250번 - ACM 호텔

백준 웹사이트 "10250번 - ACM 호텔" 문제풀이입니다.

언어는 C언어입니다. (제출 언어: C99)

 


문제

 

10250번: ACM 호텔

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

www.acmicpc.net


소스 코드

#include <stdio.h>

int main(void){
    int T;
    scanf("%d", &T);

    for(int i=0; i<T; i++){
        int H, W, N;
        scanf("%d %d %d", &H, &W, &N);

        int X; //엘리베이터에서부터 세었을 때의 번호
        int Y; //층수
        if(N%H!=0){
            Y = N%H;
            X = N/H + 1;
        }
        else{
            Y = H;
            X = N/H;
        }

        if(X<10){
            printf("%d0%d\n", Y, X);
        }
        else{
            printf("%d%d\n", Y, X);
        }
    }
}

문제 풀이

  문제 설명이 굉장히 긴데, 결국 손님들의 방 배정이 어렵지는 않습니다. 남아있는 방들 중에서 엘리베이터와 가장 가까운 방을 배정하고, 만약 그러한 방이 여러 개면 그 중에서 가장 아래에 있는 방을 배정하면 됩니다. 예시를 들어 생각하면 쉬운데, H=6, W=12일 경우에는 101호, 201호, 301호, 401호, 501호, 601호, 102호, 202호, 302호, ... , 412호, 512호, 612호 순으로 방을 배정해나갑니다.

  위의 예시를 분석하는 것만으로도 문제는 쉽게 풀 수 있습니다. 잘 보면, '층'에 해당하는 숫자들은 1~6 사이를 순환하고, '엘리베이터에서 세었을 때의 번호'에 해당하는 숫자들은 1이 모두 나온 후, 2가 모두 나오고, 3이 모두 나오고 있습니다. 다시 말해, 앞 두 자리는 1~H 사이를 순환하고, 뒷 두 자리는 1부터 W까지 차례로 나옵니다. 이를 통해 내릴 수 있는 결론이, '층수'에 해당하는 앞 두 자리는 'N%H'로 표현이 가능하며, '엘리베이터에서 세었을 때의 번호'에 해당하는 뒷 두 자리는 'N/H + 1'로 표현이 가능하다는 것입니다 (Line 13 ~ 16). 다만, 0층은 존재하지 않고 대신에 꼭대기 층이 존재하기에 N%H가 0일 경우는 예외로 두어야 합니다 (Line 17 ~ 20).

  마지막으로 출력만 하면 되는데, 층수는 Y와 YY 두 가지 경우가 가능하지만 뒷 두 자리는 항상 XX라는 것을 기억합시다. 즉 Y는 그대로 출력하면 되지만, X는 한 자리일 경우 앞에 0을 추가해서 출력해야 합니다. 이를 반영하면, 출력 부분은 Line 22 ~ 27와 같이 됩니다.

반응형