ACM 호텔은 H층, 각 층마다 W개의 방이 있는 구조이다.
손님은 도착 순서대로 방을 배정받으며, 다음 기준을 따른다.
1. 엘리베이터와 가까운 방을 우선 배정
2. 같은 거리라면 더 높은 층 선호
즉, 방 배정 순서는 다음과 같다.
101 → 201 → 301 → ... → H01 → 102 → 202 → ...
즉 층을 먼저 채우고, 그 다음 호수를 증가시키는 방식이다.
첫째 줄
T
테스트 케이스 개수
각 테스트 케이스
H W N
조건
1 ≤ H, W ≤ 99
1 ≤ N ≤ H × W
N번째 손님이 배정받을 방 번호 출력
형식
층 + 호수 (2자리)
예
402
1203
2
6 12 10
30 50 72
402
1203
이 문제의 핵심은 다음이다.
층을 먼저 채운다
즉
로 계산할 수 있다.
H = 6, N = 10
층
10 % 6 = 4
호수
10 / 6 = 1 → +1 → 2
결과
402
나는 나머지와 몫을 이용해 직접 계산하고,
문자열로 결과를 만들어 출력했다.
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
String ans = "";
for(int i = 0; i < T; i++) {
int H = sc.nextInt();
int W = sc.nextInt();
int N = sc.nextInt();
int hight = N % H == 0 ? H : N % H;
int width = N % H == 0 ? N / H : N / H + 1;
ans += hight;
if(width < 10)
ans += ("0" + width);
else
ans += width;
ans += "\n";
}
System.out.println(ans);
}
}
강의에서는 동일한 로직을 더 간단하게 표현했다.
import java.util.Scanner;
class Main
{
public static void main (String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
while (T-- > 0) {
int H = sc.nextInt();
int W = sc.nextInt();
int N = sc.nextInt();
int floor = ((N - 1) % H) + 1;
int number = (N - 1) / H + 1;
System.out.printf("%d%02d\n", floor, number);
}
}
}
| 방식 | 특징 |
|---|---|
| 내 풀이 | 조건문으로 나머지 처리 |
| 강의 풀이 | (N-1)로 간단하게 처리 |
N % H == 0 ? H : N % H
N % H == 0 ? N/H : N/H + 1
→ 나머지가 0일 때 따로 처리 필요
(N - 1) % H + 1
(N - 1) / H + 1
→ 모든 경우를 하나의 식으로 처리 가능
층 = ((N - 1) % H) + 1
호수 = ((N - 1) / H) + 1
System.out.printf("%d%02d\n", floor, number);
%02d → 두 자리로 출력 (앞을 0으로 채움)각 테스트 케이스마다 계산은 상수 시간
O(1)
전체 시간 복잡도
O(T)
이 문제는 처음 보면 복잡해 보이지만,
실제로는 나머지와 몫을 이용한 간단한 수학 문제였다.
처음에는 나머지가 0인 경우를 따로 처리했지만,
강의 풀이처럼 (N-1)을 활용하면 모든 경우를 하나의 식으로 처리할 수 있다.
즉,
(N-1) 활용 → 조건문 제거 → 코드 단순화
이 문제의 핵심 포인트였다.