10250번: ACM 호텔
프로그램은 표준 입력에서 입력 데이터를 받는다. 프로그램의 입력은 T 개의 테스트 데이터로 이루어져 있는데 T 는 입력의 맨 첫 줄에 주어진다. 각 테스트 데이터는 한 행으로서 H, W, N, 세 정수
www.acmicpc.net
[문제]
ACM 호텔 매니저 지우는 손님이 도착하는 대로 빈 방을 배정하고 있다. 고객 설문조사에 따르면 손님들은 호텔 정문으로부터 걸어서 가장 짧은 거리에 있는 방을 선호한다고 한다. 여러분은 지우를 도와 줄 프로그램을 작성하고자 한다. 즉 설문조사 결과 대로 호텔 정문으로부터 걷는 거리가 가장 짧도록 방을 배정하는 프로그램을 작성하고자 한다.
문제를 단순화하기 위해서 호텔은 직사각형 모양이라고 가정하자. 각 층에 W 개의 방이 있는 H 층 건물이라고 가정하자 (1 ≤ H, W ≤ 99). 그리고 엘리베이터는 가장 왼쪽에 있다고 가정하자(그림 1 참고). 이런 형태의 호텔을 H × W 형태 호텔이라고 부른다. 호텔 정문은 일층 엘리베이터 바로 앞에 있는데, 정문에서 엘리베이터까지의 거리는 무시한다. 또 모든 인접한 두 방 사이의 거리는 같은 거리(거리 1)라고 가정하고 호텔의 정면 쪽에만 방이 있다고 가정한다.
문제의 조건을 정리하고 예시를 들어 규칙을 찾아보았다.
우선 예시로는 층이 6층인 건물이다.
만약 7번째 손님이라면 1~6층의 1호실을 앞서 내어주고 102호를 배정받았을 것이다.
또, 8번째 손님이라면 202호를 배정받았을 것이다.
7번째와 8번째 경우를 건물의 층수로 나눈 식을 두고 규칙을 생각해보았다.
7 / 6 = 1 ... 1
8 / 6 = 1 ... 2
위 두 식으로 순서를 층수로 나눈 나머지는 층수가, 몫에 1을 더한 값이 호수가 되는 규칙을 알 수 있다.
하지만 예외상황이 있다. 6으로 나누어 떨어지는 순서의 경우를 생각해보자.
6 / 6 = 1 ... 0
12 / 6 = 2 ... 0
몫을 이용하여 층수는 배정할 수 있지만 나누어 떨어지면 나머지가 모두 0이므로 층수를 지정할 수 없다.
앞선 경우에서 어떤 수의 나머지는 수보다 1 작은 값까지만 나오므로 6층의 방은 배정되지 않는다.
따라서 나누어 떨어지는 수의 순서는 항상 6층으로 배정받게 된다.
위의 규칙을 건물의 높이 H, 길이 W, 순서 N를 이용해 일반화하면 다음과 같다.
식을 이용해 작성한 코드이다.
package lv8;
import java.util.Scanner;
public class No10250 {
public static int roomNumber(int n, int h) {
int xx, yy;
yy = n%h;
if(yy==0) {
yy=h;
xx=n/h;
}
else {
xx=n/h+1;
}
int roomnumber = yy*100+xx;
return roomnumber;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
for(int i=0;i<t;i++) {
int h = sc.nextInt();
int w = sc.nextInt();
int n = sc.nextInt();
int room = roomNumber(n, h);
System.out.println(room);
}
}
}
배정하는 방의 호수를 계산해주는 함수를 생성하여 코드를 짰다.