▶ 문제
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
'백준 알고리즘 > 기본수학1' 카테고리의 다른 글
[JAVA 자바] 백준 2839번 : 설탕 배달 (0) | 2022.06.13 |
---|---|
[JAVA 자바] 백준 2775번 : 부녀회장이 될테야 (0) | 2022.06.12 |
[JAVA 자바] 백준 2869번 : 달팽이는 올라가고 싶다 (0) | 2022.06.11 |
[JAVA 자바] 백준 1193번 : 분수찾기 (0) | 2022.06.11 |
[JAVA 자바] 백준 2292번 : 벌집 (0) | 2022.06.10 |