알고리즘/백준

10250번 - ACM 호텔

fleur75 2023. 3. 8. 22:38
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

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());
		int H, N, Q, R;
		StringBuilder sb = new StringBuilder();
		for(int t=0;t<T;t++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			H = Integer.parseInt(st.nextToken());
			st.nextToken();
			N = Integer.parseInt(st.nextToken())-1;
			Q = N / H;
			R = N % H;
			sb.append(R+1);
			if(Q < 9) {
				sb.append(0);
			}
			sb.append(Q+1);
			sb.append("\n");
		}
		System.out.println(sb);
		br.close();
	}
}

 

난이도에 비해 말이 길어서 힘겨운 문제입니다.

 

이 풀이의 경우 W값이 주어지나 사용할 필요가 없었는데 H값 만으로도 모든 답을 구할 수 있습니다. (어차피 모든 층의 1호를 채우면 1층부터 2호를 채우기 시작하므로 굳이 호수가 얼마나 있는지 몰라도 N과 H만으로 추론이 가능합니다.)

 

백준 기준 1위가 72ms이고 위 코드는 84ms인데 W를 사용하지 않은 영향이 크지는 않다고 생각합니다.

 

문제를 해결하기 위해서는 N번째 손님이 몇 층, 몇 호에 들어갈 지를 알아야 하는데 결과적으로 말하면 N-1을 H로 나눈 몫과 나머지를 통해 호수와 층을 구할 수 있습니다.

 

가령 6층 건물이라고 할 시 1, 2, 3, 4, 5, 6번째 손님이 1호에 들어가게 되는데 7~12번째 손님이 2호에 들어가는 식이라는 것을 쉽게 유추할 수 있습니다.

 

이 때 사용하는 트릭이 저 수들을 하나씩 앞으로 당기는 것입니다.(당기지 않으면 6일때 1이 되어버립니다.)

0~5번째 손님이 1호, 6~11번째 손님이 2호인 식으로 당기게 되면 손님의 순서를 6으로 나눈 몫이 각각 0, 1, 2식으로 증가하는 것을 발견할 수 있습니다.

 

어차피 층수 단위로 끊어지기 때문에 약간의 조절을 통해 몫과 나머지를 사용해낼 수가 있습니다.

그래서 구한 몫에 1을 더해주면 손님이 몇 호에 들어가는 지를 알 수 있습니다. 이게 한자리일 경우에는 앞에 0을 붙여줘서 1층의 경우 101과 같이 나올 수 있도록 합니다. 물론 두 자리면 110과 같이 그대로 나옵니다.

 

마찬가지로 0~5에 해당하는 나머지에 1을 더해주면 손님이 들어가는 층 수가 됩니다. 이제 층수와 호수를 모두 구했기 때문에 StringBuilder를 사용해서 더해주기만 하면 끝입니다. 테스트케이스가 많기 때문에 모든 출력을 StringBuilder에 넣고 한 번에 출력합니다.