본문 바로가기
백준 알고리즘 단계별 풀이 (문제 수)/기본 수학 1 (8)

[C++] ACM 호텔 : 10250번

by 17번 일개미 2022. 7. 4.
728x90

문제

 

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와 같아진다. 

728x90