백준 알고리즘/기본수학1

[JAVA 자바] 백준 10250번 : ACM 호텔

Sun720 2022. 6. 11. 10:24

▶ 문제

https://www.acmicpc.net/problem/10250

 

10250번: ACM 호텔

프로그램은 표준 입력에서 입력 데이터를 받는다. 프로그램의 입력은 T 개의 테스트 데이터로 이루어져 있는데 T 는 입력의 맨 첫 줄에 주어진다. 각 테스트 데이터는 한 행으로서 H, W, N, 세 정수

www.acmicpc.net

 

 설명

문제에서처럼 12호씩 6층짜리 호텔이라고 할 때 방에 손님이 차지하는 순서는 왼쪽 열부터 아래층에서 위층으로 향한다.

순서를 매겨보면 아래와 같다.

1번째 손님 2번째 손님 3번째 손님 4번째 손님 5번째 손님 6번째 손님
101호 201호 301호 401호 501호 601호
7번째 손님 8번째 손님 9번째 손님 10번째 손님 11번째 손님 12번째 손님
102호 202호 302호 402호 502호 602호

 

방 번호의 규칙 찾기

방 번호는 앞번호와 뒷번호의 조합으로 되어 있다.

1번째 손님부터 6번째 손님의 방 번호를 살펴보면 앞번호는 1씩 증가하되 6까지만 증가할 수 있고,

뒷번호는 일정하게 하나의 수로 동일하다.

 

7번째 손님부터 12번째 손님의 방 번호를 1~6번째 손님과 비교해 살펴보자면

앞 번호는 1씩 증가하는 것이 똑같고, 뒷번호가 1~6번째 손님보다 1씩 크다는 것을 알 수 있다.

 

구하려는 배정 순서에서 6층을 나누면 방 번호의 뒷자리를 구할 수 있고,

나눴을 때 나머지가 존재한다면 그 값은 층을 의미하므로 방 번호의 앞자리를 구할 수 있게 된다.

 

조건 추가하기

여기서 더 추가해야 할 것은, 나눴을 때 나누어 떨어진다면 나머지가 0이 될 것이고 그러면 방 번호의 앞자리는 0이 되어 버린다. 방은 1부터 시작하므로 0이 온다는 것은 말이 안된다. 이 경우에만 특수하게 최고층 숫자를 대입 시켜야 한다.

 

그리고 뒷자리를 구할 때 6층으로 나누기만 하는 것이 아니라

위와는 다르게  6으로 나누었을 때 나머지가 발생할 경우 나눈 값에 +1을 해주어야 한다.

 

조건을 두 개 추가한 이유는 비슷한 맥락이라고 볼 수 있다. 방 번호의 앞번호와 뒷번호가 0이 아닌 1로 시작하기 때문이다.

 

예제를 수식으로 풀어보기

위의 말들을 토대로 예제를 풀어보자면,

10번째 손님의 방 번호는

앞 번호 : 10 % 6

뒷 번호 : 10 / 6    +1  ( 10%6 의 값이 0이 아니므로 1 더하기) 

방 번호 조합하기 ==>  402

 

 

 

문제 풀이

🌱 풀이.

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));
		StringTokenizer st;
		StringBuilder sb = new StringBuilder();
		int t = Integer.parseInt(br.readLine());

		while (t-- > 0) {
			st = new StringTokenizer(br.readLine(), " ");
			int h = Integer.parseInt(st.nextToken()); //층
			st.nextToken();//한 층에 있는 방 개수
			int n = Integer.parseInt(st.nextToken()); //손님 배정 순서

			int frontNum = n % h; // 앞 번호
			int backNum = n / h; //뒷 번호
			if (frontNum != 0) {
				backNum++;
			} else {
				frontNum = h;
			}
			
			sb.append(frontNum).append(String.format("%02d", backNum)).append("\n");
		}
		System.out.println(sb);

	}

}

 

 

 

 


h, w, n 을 StringTokenizer 객체를 이용하여서 입력 받을 때

w 값은 이 코드에서 사용하지 않을 예정이라 변수에 따로 저장하지 않았다.

 

 

 

방 번호는 앞 번호와 뒷 번호의 조합으로 되어 있는데 앞 번호는 번호 그대로 합치면 되지만 뒷 번호는 2자리 수로 만들어 준 후에 합쳐야 한다. 즉 1자리로 된 숫자면 앞에 0을 붙여 주어야 한다는 의미이다. 그래서 String.format() 의 인수로 "%02d" 를 입력하여 출력하였다. 

(StringBuilder 에 넣을 땐 String.format() 메소드를 이용하는 것이 편하다.)

 

 

Log

 

728x90
반응형