https://www.acmicpc.net/problem/10250
- 문제
- 문제 풀이
백준 10250번 ACM 호텔은 브론즈 3 난이도의 수학 및 구현 문제이다. 이 문제에서는 호텔의 층 수 H, 각 층의 방 수 M, 그리고 N번째 손님이 주어진다. 손님들은 정문으로부터 가장 짧은 방을 선호한다고 할 때 몇 번 방을 배정받는지를 출력하면 되는 문제이다.
우선 예시를 살펴보겠다.
EX) H = 6, W = 12, N = 10
위에 있는 사진과 같은 호텔이 있다고 가정해 보겠다. 총 6층짜리 호텔이고 각 층에는 방이 12개씩 있다. 이때, 10번째 손님이 들어왔을 때 몇 번째 방을 배정받는지를 구하면 된다.
위에 있는 사진처럼 10번째 손님이므로 4번째 층에 있는 두 번째 방, 즉 402호를 배정받는 것을 알 수 있다.
우선 손님이 몇 층에 있는 방을 배정받는지 살펴보겠다.
이런 유형의 문제는 패턴을 찾아서 접근하면 조금 더 수월하게 풀 수 있다. 위와 같은 호텔에서 첫 번째 손님이라면 당연히 1층에 있는 방을 배정받고 6번째 손님이면 6층에 있는 방을 배정받고 7번째 손님이면 다시 1층에 있는 방을 배정받는 대신에 두 번째 방을 배정받는다.
여기서 손님이 머무는 층은 다음과 같은 공식으로 구할 수 있다.
if (n % h == 0) 층 = h
else 층 = n % h
그리고 몇 번째 방을 배정받는지를 살펴보겠다. 1 ~ 6번째 손님은 1번째 방, 7 ~ 12번째 손님들은 2번째 방을 배정받았다. 따라서 Math.ceil (n / h) 번 방을 배정받는 것을 알 수 있다.
이러한 로직을 밑에 있는 코드로 옮겼다.
- 코드
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine()); //테스트 케이스 개수
StringBuilder sb = new StringBuilder();
for (int i = 0; i < t; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int h = Integer.parseInt(st.nextToken()); //층 수
int w = Integer.parseInt(st.nextToken()); //각 층의 방 수
int n = Integer.parseInt(st.nextToken()); //n번째 손ㄴ;ㅁ
if (n % h == 0) { //나머지가 0이면 가장 높은 층으로 올라감
sb.append(h);
} else {
sb.append(n % h);
}
double room = Math.ceil((double)n / (double)h);
if (room < 10) {
sb.append("0");
}
sb.append((int)room + "\n");
}
System.out.print(sb);
}
}
'백준' 카테고리의 다른 글
[백준] 2941번 : 크로아티아 알파벳 – JAVA [자바] (0) | 2022.07.11 |
---|---|
[백준] 2869번 : 달팽이는 올라가고 싶다 – JAVA [자바] (0) | 2022.07.11 |
[백준] 2292번 : 벌집 – JAVA [자바] (0) | 2022.07.10 |
[백준] 2751번 : 수 정렬하기 2 – JAVA [자바] (0) | 2022.07.10 |
[백준] 2798번 : 블랙잭 – JAVA [자바] (0) | 2022.07.10 |
댓글