알고리즘/백준

BOJ) ACM 호텔(10250, JAVA)

Zin0_0 2020. 8. 24. 17:00
반응형

풀이

 

1년 전에 못풀어던 문제였다. (문제를 풀기 시작하고 알았다.)

호텔의 층수, 한 층마다 방의 개수, 손님의 순번이 순차적으로 주어진다.

호텔에 머무는 손님들은 왜인지 모르겠지만, 가장 적게 걷는 것을 선호한다고 한다.그래서 각 층의 1호방 -> 각 층의 2호방 순으로 순차적으로 배정된다.(101, 201, 301 ... 102, 202호 이런 식으로 방이 배정됨)

 

풀고나니까 생각보다 간단했다.

 

우선 배정될 층의 높이는 n % h를 통해 구해줬다. n층에서 몇번째 위치하는지 구한것이다. 주의해야할 점은 n % h == 0인 경우에는, 가장 꼭대기 층에 배정해줘야 한다는 점이다. (배정 층의 순서를 생각해보면, 1층 -> 2층 -> 3층 ... h층인데,  h % h => 0이기 때문)

 

다음으로는 해당 층에서 몇번째 방을 부여해야 하는지다.이는 n / h 몫을 통해 알 수 있다. 앞에서 몇번째 층까지 채워졌는지 확인하면 방의 순번을 구할 수 있다.여기서도 주의할 점은 floor가 꼭대기 층인 경우를 제외하고는 몫 +1이 방 번호가 된다는 점! 

 

 

코드

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    final static String newLine = "\n", ZERO = "0";

    public static void main(String[] args) throws IOException {
        solution(new BufferedReader(new InputStreamReader(System.in)));
    }

    private static void solution(BufferedReader br) throws IOException {
        int testCase = parseInt(br.readLine());
        StringBuffer sb = new StringBuffer();

        for(int i=0; i<testCase; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int h = parseInt(st.nextToken());
            int w = parseInt(st.nextToken());
            int n = parseInt(st.nextToken());
            sb.append(getRoomNumber(h,w,n)).append(newLine);
        }
        br.close();
        System.out.println(sb.toString());
    }

    private static String getRoomNumber(int h, int w, int n) {
        StringBuffer sb = new StringBuffer();
        int floor = n % h;
        if(floor ==0)   floor = h;

        int order = n / h;
        if(floor != h)  order++;

        sb.append(floor);
        if(order/10 ==0)    sb.append(ZERO);
        sb.append(order);

        return sb.toString();
    }

    private static int parseInt(String numStr) {
        return Integer.parseInt(numStr);
    }
}
반응형