본문 바로가기
Algorithm

[구현/수학] 백준 10250 ACM호텔 - Python

by jangThang 2022. 2. 9.
반응형

백준 온라인 저지

 

[ Contents ]

     

     

    1. 문제 (링크 참조)

     

    10250번: ACM 호텔

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

    www.acmicpc.net

     

     

     

    2. 문제 풀이

     호텔의 층 수와 층별 방의 개수가 주어졌을 때, n번째 방을 찾는 문제입니다.

    방의 순서는 101, 201, 301... 과 같이 층 수가 높아지며, 마지막 층에 다다르면 1층 다음방(102)으로 넘어갑니다.

     

    2022.01.19 - [Algorithm] - [Algorithm] 단골 1번 문제, 구현 / 수학

     

    [Algorithm] 단골 1번 문제, 구현 / 수학

    [ Contents ] 1. 구현  단순히 '구현'만 하면 되는 문제 유형입니다. 문제를 이해하고 입력에 맞춰 적절한 출력만 하면 됩니다. 특별한 알고리즘이나 프로그래밍적 기법 없이, 단순 제어문만 사용하

    star7sss.tistory.com

     배정하는 방의 순서를 파악해야하는 문제입니다. 규칙만 이해하면, 쉽게 풀 수 있습니다.

     

     

     한 층씩 높아지며, 마지막 층에 다다르면 1층 다음방으로 넘어갑니다. 방 번호를 매기는 순서가 '수평'적이라면 방 배정 순서는 '수직'적입니다. (방 번호는 1층을 다 채우면, 다음 층으로 넘어감)

     

     

    3. 코드

    import sys
    input = sys.stdin.readline
    
    T = int(input())
    for i in range(T):
        H, W, N = map(int, input().split())
        cnt = 1
        room = ''
        for num in range(1, W+1):
            for floor in range(1, H+1):
                if cnt == N:
                    room = str(floor) + f"{num:02d}" #H,W는 1부터 99까지
                    cnt += 1
                    break
                cnt += 1
            if cnt == N+1:
                break
        print(room)

     brute Force 방식으로 방 번호를 하나씩 세면서 풀 수도 있습니다. 수직적으로 방을 배정하면 되므로, 바깥 for문을 방 번호로 하고 안쪽 for문을 층 수로 순환합니다. 

     

    2022.01.16 - [Algorithm] - [Algorithm] 브루트 포스(Brute Force)는 노가다 기법?

     

    [Algorithm] 브루트 포스(Brute Force)는 노가다 기법?

    [ Contents ] 1. 브루트 포스란?  Brute(짐승 같은, 난폭한) + Force(힘, 폭력)의 합성어입니다. 무식하게 푸는 기법으로, '노가다'에 가까운 접근법입니다. 모든 경우의 수를 시험해보며 문제를 해결합니

    star7sss.tistory.com

     


     

    import sys
    input = sys.stdin.readline
    
    T = int(input())
    for i in range(T):
        H, W, N = map(int, input().split())
        print(f"{(N-1)%H+1}{(N-1)//H+1:02d}")

     수학적으로 접근해서 규칙을 찾아낼 수도 있습니다. 일반적으로 N을 H(높이)로 나눈 나머지[N%H]가 층 수가 되고, N을 H(높이)로 나눈 몫+1[N//H+1]이 방 번호가 됩니다. 

     하지만, N이 H의 배수일 경우에는 나머지가 0이 되버립니다. (10층의 10번 손님은 0층...)

     따라서 배수로 나눠지지 않도록 조건문으로 따로 처리해주든지, 아니면 N-1로 나누고 +1를 해주는 방식으로 나눠지지 않도록 합니다.

     

     

    star가 되고나서 Tistory

    반응형

    댓글