처음부터 차근차근
acm 호텔 문제 본문
문제
https://www.acmicpc.net/problem/10250
10250번: ACM 호텔
프로그램은 표준 입력에서 입력 데이터를 받는다. 프로그램의 입력은 T 개의 테스트 데이터로 이루어져 있는데 T 는 입력의 맨 첫 줄에 주어진다. 각 테스트 데이터는 한 행으로서 H, W, N, 세 정수
www.acmicpc.net
걷는걸 참 싫어하는 손님이다...ㅋㅋ
계획
<변수명 짓기>
테스트 케이스 개수 : test_num
호텔 층 수 : h
호텔 방 수 : w
몇 번째 손님 : n
호텔 방 -> boolean형 2차원 배열
boolean[][] rooms = new boolean[h][w];
** int형 2차원 배열을 이용해서 만드려고 했으나 int형은 4바이트, boolean형은 1바이트이므로 boolean형을 선택했다.
for문을 이차원 배열을 순환하며 손님이 들어간 방은 true로 설정.
제일 마지막 손님 n번째 손님의 방 번호를 출력하게 설계
import java.io.*;
import java.util.*;
public class Main
{
public static void main(String[] args) {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
int h;// 층
int w; // 1층 당 방 개수
int n; // 몇 번째 손님
int test_num = Integer.parseInt(br.readLine());
for (int t = 0; t < test_num; t++) {
st = new StringTokenizer(br.readLine());
h = Integer.parseInt(st.nextToken());
w = Integer.parseInt(st.nextToken());
n = Integer.parseInt(st.nextToken());
boolean[][] rooms = new boolean[h][w];
boolean is_find = false; // 손님이 방을 찾았는지
for (int k = 0; k < n; k++) {
for (int i = 0; i < w && !is_find; i++) {
for (int j = 0; j < h && !is_find; j++) {
if (!rooms[j][i]) {
rooms[j][i] = true;
is_find = true;
if (k == n - 1) {
bw.write(String.valueOf(((j + 1) * 100) + i + 1) + "\n");
}
break;
}
}
}
is_find = false;
}
rooms = new boolean[h][w];
}
br.close();
bw.flush();
bw.close();
}
catch (IOException e) {
System.out.println("IOException 발생");
}
}
}
복잡하다 복잡해
무려 4중 for문을 쓴 풀이이다.
일단 답은 맞췄는데 풀이가 좀 더러운 것 같아서 다른 분들은 어떻게 푸셨나 봤다.
다른 분들의 풀이를 봤더니, 이건 수학을 가지고 푸는 알고리즘 문제였다는 사실을 망각하고 있었다고 깨달았다.
이 문제의 원리를 생각해보면
1층부터 마지막 층까지 차례대로 배정됐다가 다시 1층으로 배정하는 원리이다.
이 규칙성을 이용해서
층 수 : 몇 번째 손님인지 % 층 수
몇 번째 방 : 몇 번째 손님인지 / 층 수 + 1
이런 식을 도출할 수 있다.
그 다음 층 수에 곱하기 100을 해주고, 거기에 몇 번째 방인지 구한 값을 더해주면 값이 나온다.
이렇게 구하면 n % h의 나머지가 나누어 떨어지는 경우가 있는데
만약 2층 호텔의 4번째 손님이 들어갈 층 수를 구하면 저 식으로는 0층이 나온다.
그러므로 나누어 떨어지는 구간만 +1을 해줘야한다.
마찬가지로 몇 번째 방인지를 구할 때도 -1을 해줘야한다.
다시 푼 풀이
'알고리즘' 카테고리의 다른 글
시간 복잡도 정리 (0) | 2023.09.06 |
---|---|
정수 n개의 합 구하기 (1) | 2023.01.26 |
달팽이는 올라가고 싶다 - 문제풀이(수정 중) (0) | 2022.10.23 |
최소로 거치는 벌집 개수 구하기 (0) | 2022.10.22 |
이친수 구하기 - 동적계획법 (2) | 2022.10.14 |