[class 1]백준 ACM 호텔(10250번) 풀이 (C++/Python)
문제 : ACM 호텔(10250번)(Bronze III)
문제 링크 : https://www.acmicpc.net/problem/10250
출처 : Baekjoon Online Judge
이 문제를 풀려면 직접 그려서 확인해봐야 합니다.
| H | O | T | E | L | ||
| 엘 | 501 | 502 | 503 | 504 | 505 | ... |
| 리 | 401 | 402 | 403 | 404 | 405 | ... |
| 베 | 301 | 302 | 303 | 304 | 305 | ... |
| 이 | 201 | 202 | 203 | 204 | 205 | ... |
| 터 | 101 | 102 | 103 | 104 | 105 | ... |
이렇게 되어 있습니다.
자, 여기서 문제에 나온 규칙들을 확인하겠습니다.
1. 엘리베이터 타는 거리는 고려하지 않는다.
2. 같은 거리이면 되도록 가장 아래의 층을 선호한다.
위 규칙들을 반영하여 H = 5일 때 1번부터 25번부터 배치하면 다음과 같습니다.
| H | O | T | E | L | ||
| 엘 | 5 | 10 | 15 | 20 | 25 | ... |
| 리 | 4 | 9 | 14 | 19 | 24 | ... |
| 베 | 3 | 8 | 13 | 18 | 23 | ... |
| 이 | 2 | 7 | 12 | 17 | 22 | ... |
| 터 | 1 | 6 | 11 | 16 | 21 | ... |
이렇게 배치할 수 있습니다.
참 쉽죠?
자, 이제 H = 6일 때 어떻게 나오는지 확인해보겠습니다.
| 1호 | 2호 | 3호 | 4호 | 5호 | ||
| 6층 | 6 | 12 | 18 | 24 | 30 | ... |
| 5층 | 5 | 11 | 17 | 23 | 29 | ... |
| 4층 | 4 | 10 | 16 | 22 | 28 | ... |
| 3층 | 3 | 9 | 15 | 21 | 27 | ... |
| 2층 | 2 | 8 | 14 | 20 | 26 | ... |
| 1층 | 1 | 7 | 13 | 19 | 25 | ... |
문제에 나온 예시 입력 H, W, N = 6, 12, 10에서 높이가 6이고 너비가 12인 경우 10번째 손님은 402호에 머무는 것을 확인할 수 있습니다.
그러면 이것을 어떻게 구현해야 할까요?
우선 1-based index이므로 컴퓨터가 연산할 수 있도록 0-based index로 변환합니다.
이 때 N도 각각 -1을 합니다.
| 0호 | 1호 | 2호 | 3호 | 4호 | ||
| 5층 | 5 | 11 | 17 | 23 | 29 | |
| 4층 | 4 | 10 | 16 | 22 | 28 | |
| 3층 | 3 | 9 | 15 | 21 | 27 | |
| 2층 | 2 | 8 | 14 | 20 | 26 | |
| 1층 | 1 | 7 | 13 | 19 | 25 | |
| 0층 | 0 | 6 | 12 | 18 | 24 |
규칙이 보이시나요?
층(floor)은 N-1 기준으로 H로 나눈 나머지이고, 호(room)는 N-1 기준으로 H로 나눈 몫이 나옵니다.
예시로 N = 10 볼까요?
그러면 N-1 = 9이며 H = 6이라고 가정하면 9 % 6 = 3, 9 / 6 = 1이 됩니다.
이것은 0-based index 기준으로 3층, 1호라는 뜻이고 1-based index로 바꾸면 4층, 2호가 되며 이것은 402호로 나오게 됩니다.
1-based index -> 0-based index로 변환할 때 N -> N-1이 되고 나머지 연산 및 몫 연산을 한 후 0-based index -> 1-based index로 변환할 때 연산 결과값에 각각 1씩 더합니다.
floor = (N - 1) % H + 1
room = (N - 1) / H + 1
따라서 결과값 result = 100 * floor + room이 됩니다.
이것을 C++ 및 Python 소스 코드로 구현합니다.
[C++]
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while(t--) {
int h, w, n;
cin >> h >> w >> n;
int floor = (n - 1) % h + 1;
int room = (n - 1) / h + 1;
int result = 100 * floor + room;
cout << result << '\n';
}
return 0;
}
[Python]
import sys
input = sys.stdin.readline
T:int = int(input().rstrip())
for _ in range(T) :
H, W, N = map(int, input().split())
floor:int = (N - 1) % H + 1
room:int = (N - 1) // H + 1
result:int = 100 * floor + room
print(result)
참고로 너비(W) 변수는 이 문제에서 장식입니다.