#60. 백준 10250번 문제 풀이: ACM 호텔 문제 원본 보기
H(층) W(층당 방개수) 의 호텔이 있다. 아래의 경우 H(3) W(4) 인 호텔의 모습니다. W=4 ------------------ E|301|302|303|304| l|201|202|203|204| H=3 e|101|102|103|104| ------------------ 사람들은 엘리베이터에서 가까운 방, 같은 거리라면 아래층을 선호한다. 엘리베이터를 타고 이동하는 거리는 신경쓰지 않는다. 선호도로 나열해 보면, 101, 201, 301, 102, 202 ...순이 된다. N 번째 손님이 경우, 선호하는 순으로 방을 배정하시오. 입력: 첫줄에 테스트 케이스 개수 T, 둘째줄에 H W N (1 ≤ H, W ≤ 99, 1 ≤ N ≤ H × W) 출력: 배정할 방번호
입력/출력
--입력--
2
6 12 10
30 50 72
--출력--
402
1203
문제풀이+해설
호수는 [층수][호수]의 조합이다.
선호도는 앞쪽호수 우선, 층수쪽으로 우선이다.
N 번째 손님이라면, /(나누기 몫), 호수는 1부터 시작하므로 +1 해줌.
 선호 호수 = (N / 층수) + 1
가 되고, %(나누기 나머지)
 선호 층수 = N % 층수
가 된다.

여기서 한가지 고려해야 할 것은 손님 순서가 층수의 배수이면 나머지가 0 이 된다.
0이 의미하는 건 0층이 아니라 꼭대기 층일 경우이다. 그래서 나머지가 0일 경우 별도 처리해 주어야 한다.
 호수 = N / H
 층수 = H (꼭대기층) 
이 된다. 
호수가 9이하일 경우 09 식으로 0을 붙여줘야 한다. C++에서 여러가지 방법이 있지만 cout 으로 처리하는 방법을 사용했다. cout.width(2); cout.fill('0'); 처럼 해 주면 2자리수에 빈자리가 있으면 0으로 채워둔다.
code sol.
#include <iostream>
using namespace std;

int main() {
  int i, T, H, W, N, n, f;
  cin >> T; // 테스트 케이스 개수를 정수로 받는다.
  for(i = 0; i < T; i++) { // 테스트 케이스 만큼 반복
    cin >> H >> W >> N;
    // 호텔 층수, 각층의 방수, 몇 번째 손님인지를 받는다.
    if(N % H == 0) { // 꼭대기 층은 나누면 0층이 되므로 꼭대기 층으로 처리해 준다.
      n = N / H; // 선호 호수
      f = H; // 층은 꼭대기층
    } else {
      n = (N / H) + 1; // 선호 호수, 호수는 1부터이므로 +1 해줌.
      f = N % H; // 선호 층수
    }
    cout << f;
    cout.width(2); cout.fill('0');
    cout << n << endl; // 층호수, 즉 방번호 형식으로 출력
  }
  return 0;
}
© 코드솔 - CodeSol. All Rights Reserved.