[ Contents ]
1. 문제 (링크 참조)
2. 문제 풀이
호텔의 층 수와 층별 방의 개수가 주어졌을 때, n번째 방을 찾는 문제입니다.
방의 순서는 101, 201, 301... 과 같이 층 수가 높아지며, 마지막 층에 다다르면 1층 다음방(102)으로 넘어갑니다.
2022.01.19 - [Algorithm] - [Algorithm] 단골 1번 문제, 구현 / 수학
배정하는 방의 순서를 파악해야하는 문제입니다. 규칙만 이해하면, 쉽게 풀 수 있습니다.
한 층씩 높아지며, 마지막 층에 다다르면 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)는 노가다 기법?
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를 해주는 방식으로 나눠지지 않도록 합니다.
'Algorithm' 카테고리의 다른 글
[수학/소수] 백준 11653 소인수분해 - Python (0) | 2022.02.09 |
---|---|
[수학/소수] 백준 2581 소수 - Python (0) | 2022.02.09 |
[Brute Force] 백준 2798 블랙잭 - Python (0) | 2022.02.09 |
[수학/소수] 백준 1929 소수 구하기 - Python (0) | 2022.02.08 |
[Algorithm] 소수 판별 알고리즘, 에라토스 테네스의 체 (0) | 2022.02.08 |
댓글