10250번: ACM 호텔

프로그램은 표준 입력에서 입력 데이터를 받는다. 프로그램의 입력은 T 개의 테스트 데이터로 이루어져 있는데 T 는 입력의 맨 첫 줄에 주어진다. 각 테스트 데이터는 한 행으로서 H, W, N, 세 정수

www.acmicpc.net

문제

문제에 설명이 길지만, 자세히 보면 간단한 문제이다.

 

키포인트

  1. 손님이 오른쪽으로 한 칸씩 이동할 때마다 거리가 1씩 늘어난다.

  2. 엘레베이터를 손님의 출발 시작 기준으로 잡기 때문에 101, 201, 301호 모두 다 거리는 1이다.

  3. 손님은 이동거리가 같으면 아래층을 더 선호한다고 한다. 

 

요약하자면, 입력 데이터에서 높이가 3으로 주어졌을 때, 손님은 101, 201, 301순으로 찰 것이고 h의 높이만큼 손님이 가득차게 되면 이동거리가 1증가하고, 높이가 가장 낮은 곳으로 (102호)의 호텔방이 배정될 것이다.

 

 

입력

첫째줄 : 테스트 케이스 개수

둘째줄부터 : 각 테스트 데이터에 대한 정보

각 테스트 데이터는 한 행으로서 H, W, N, 세 정수를 포함하고 있으며 각각 호텔의 층 수, 각 층의 방 수, 몇 번째 손님인지를 나타낸다(1 ≤ H, W ≤ 99, 1 ≤ N ≤ H × W). 

 

출력

N 번째 손님에게 배정되어야 하는 방 번호를 출력한다.

 

코드

#include <iostream>

using namespace std;

int main()
{
	int loop;
	//h: 호텔의 높이 w: 호텔의 넓이, n: 몇 번째 손님인지 나타냄.
	int h, w, n;

	//x는 호텔 가로 너비의 호수를 뜻함. y는 층의 위치를 뜻함. => y=100, x=1 => x+y = 101호
	int x_location = 1;
	int y_location = 100;
	int result = 0;

	cin >> loop;

	for (int i = 0; i < loop; i++) {
		cin >> h >> w >> n;
		//
		for (int j = 0; j < n-1; j++) {
			//건물의 층 호수(y_location)가 건물의 총 높이보다 높아지면 100으로 초기화 
			if ((h * 100) == y_location) {
				y_location = 100;

				if (w > x_location) {
					x_location += 1;
				}
			}
			else y_location += 100;
		}
		result = y_location + x_location;
		printf("%d\n", result);

		result = 0;
		x_location = 1;
		y_location = 100;
	}

	return 0;
}

예제 입력 6 12 10을 예시로 들면, 코드에서 시작지점은 무조건 101호로 잡았으니 n번(10번) 반복하는 것이 아닌 9번만 반복하면 되기에 n-1번 동안 반복문을 수행한다.