알고리즘/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; }