문제
H = 6 이고 W = 12 인 H × W 호텔을 간략하게 나타낸 그림
방 번호는 YXX 나 YYXX 형태인데 여기서 Y 나 YY 는 층 수를 나타내고 XX 는 엘리베이터에서부터 세었을 때의 번호를 나타낸다. 즉, 그림 1 에서 빗금으로 표시한 방은 305 호가 된다.
손님은 엘리베이터를 타고 이동하는 거리는 신경 쓰지 않는다. 다만 걷는 거리가 같을 때에는 아래층의 방을 더 선호한다. 예를 들면 102 호 방보다는 301 호 방을 더 선호하는데, 102 호는 거리 2 만큼 걸어야 하지만 301 호는 거리 1 만큼만 걸으면 되기 때문이다. 같은 이유로 102 호보다 2101 호를 더 선호한다.
여러분이 작성할 프로그램은 초기에 모든 방이 비어있다고 가정하에 이 정책에 따라 N 번째로 도착한 손님에게 배정될 방 번호를 계산하는 프로그램이다. 첫 번째 손님은 101 호, 두 번째 손님은 201 호 등과 같이 배정한다. 그림 1 의 경우를 예로 들면, H = 6이므로 10 번째 손님은 402 호에 배정해야 한다.
문제 해석
문제를 간단하게 정리하면, 손님은 각 엘리베이터 입구에서 부터 가장 가까운 방을 선호한다.
즉 호수가 낮을 수록 우선순위가 높아진다.
단, 호수가 같을 경우 층수가 낮을수록 선호한다.
이 말은, 한 호텔에 손님을 순서대로 채워넣을 건데
손님은 1층부터 꼭대기 층까지 각 1호에 먼저 들어간다.
그 후, 1층부터 꼭대기층까지 각 2호에 들어간다.
아래에서부터 호수의 순서대로 채우면 되는 것이다.
풀이
#include <iostream>
using namespace std;
int main()
{
int testCase; // 테스트 케이스 수
int H; int W; int N; // 층 수, 방 수, N 번째 손님
cin >> testCase; cin.ignore();
int* room = new int[testCase];
for (int i = 0; i < testCase; i++)
{
cin >> H >> W >> N; cin.ignore();
// 손님의 방 번호 : N / H + 1
// 손님의 층 번호 : N % H
if (N % H == 0) // 만약 나누어 떨어진다 >> 꼭대기 층이다.
{
room[i] = H * 100 + N / H; // 호실 생성
}
else
{
room[i] = (N % H) * 100 + N / H + 1; // 호실 생성
}
}
for (int i = 0; i < testCase; i++) // 호실 출력
{
cout << room[i] << "\n";
}
delete[] room;
}
높이가 6, 가로가 12라고 가정
N 번째 손님의 층 번호는 N % H 가 된다. ex) 5번째 손님의 층번호는 5 % 6 = 5 >> 5층에 배정
N 번째 손님의 방 번호는 N / H + 1이 된다. ex) 5번째 손님의 방번호는 5 / 6 + 1 = 1 >> 1호에 배정
즉, 501호가 된다.
단, 꼭대기 층의 경우는 N % H의 값이 0이 되므로 계산결과가 이상해질 수 있다.
따라서 따로 조건을 분류하여준다.
꼭대기 층 손님의 층수는 무조건 H와 같아진다.
'백준 알고리즘 단계별 풀이 (문제 수) > 기본 수학 1 (8)' 카테고리의 다른 글
[C++] 설탕 배달 : 2839번 (0) | 2022.07.04 |
---|---|
[C++] 부녀회장이 될테야 : 2775번 (0) | 2022.07.04 |
[C++] 달팽이는 올라가고 싶다 : 2869번 (0) | 2022.07.04 |
[C++] 분수 찾기 : 1193번 (0) | 2022.07.04 |
[C++] 벌집 : 2292번 (0) | 2022.07.04 |