알고리즘/BOJ

[BOJ] 10250 - ACM 호텔

쭁쭁이 2018. 4. 2. 14:36

문제

https://www.acmicpc.net/problem/10250

방의 개수가 h * w인 호텔에 손님이 올 때마다 엘레베이터와 가까운 순서대로 방을 배정하고

n번째 손님이 어느 방에 배정될 것인지를 찾는 문제.



난이도

난이도 下, 소요시간 20분 이내


풀이 과정

h : 호텔의 층 수

w : 한 층당 방 수

n : n번째 손님


101호 -> 201호 -> 301호 -> ... -> h01호 ->

102호 -> 202호 -> 302호 -> ... -> h02호 -> ...


순이므로 n번째 손님은 n % h층으로 들어갈 것임을 먼저 생각해볼 수 있고

호수는 n / h의 몫에 1을 더한 것임을 쉽게 알 수 있다.

즉, n%h층 n/h + 1호 가 된다.

건물의 왼쪽 줄부터 채워지기 시작하기 때문에 w는 식에 필요가 없지만

범위를 제한하기 위해서 쓰인다.

호수가 w를 초과해서는 안되므로 n/h + 1 <= w 가 된다.


규칙이 복잡하지 않고 매우 단순하다.

.

.

.

.

.

.

라고 생각했지만

제출했더니 실패가 나왔다...


테스트 케이스를 아무거나 넣어가면서 몇 번 해보고 문제를 알게 되었다.

n이 h로 나누어 떨어질 때 004호 와 같은 식으로 나온다는 것.


따져보면 n이 h로 나누어 떨어질 때는 손님이 h층에 입실하게 된다.

그리고 1층으로 되돌아가지 않으므로 호수는 n/h + 1호가 아니라 n/h호가 된다.


따라서 다음과 같이 코드를 짜면 된다.

#include <iostream>

using namespace std;

int main(void)
{
	int test = 0;
	cin <> test;
	for (int t = 0; t < test; t++)
	{
		int h = 0, w = 0, n = 0;
		cin >> h; cin >> w;
		cin >> n;

		int floor = (n % h == 0) ? h : n % h;	// 층 수(n이 h로 나누어 떨어지면 층 수 = h)
		int room = (floor == h) ? n / h : n / h + 1;	// 호 수(n이 h로 나누어 떨어지면 +1을 하지 말아야 함)

		if (room > w)		// 한 층당 방의 개수를 초과하여 방이 존재할 수 없으므로 예외처리
			break;

		cout << floor;
		if (room < 10)
			cout << 0;		// 호수가 1~9호라면 호수 앞에 0을 붙여줌
		cout << room << endl;
	}
	return 0;
}