호텔을 운영 중인 코니는 최소한의 객실만을 사용하여 예약 손님들을 받으려고 합니다. 한 번 사용한 객실은 퇴실 시간을 기준으로 10분간 청소를 하고 다음 손님들이 사용할 수 있습니다.
예약 시각이 문자열 형태로 담긴 2차원 배열 book_time이 매개변수로 주어질 때, 코니에게 필요한 최소 객실의 수를 return 하는 solution 함수를 완성해주세요.
제한사항
입출력 예
| book_time | result |
|---|---|
| [["15:00", "17:00"], ["16:40", "18:20"], ["14:20", "15:20"], ["14:10", "19:20"], ["18:20", "21:20"]] | 3 |
| [["09:10", "10:10"], ["10:20", "12:20"]] | 1 |
| [["10:20", "12:30"], ["10:20", "12:30"], ["10:20", "12:30"]] | 3 |
입출력 예 설명
입출력 예 #1

위 사진과 같습니다.
입출력 예 #2
첫 번째 손님이 10시 10분에 퇴실 후 10분간 청소한 뒤 두 번째 손님이 10시 20분에 입실하여 사용할 수 있으므로 방은 1개만 필요합니다.
입출력 예 #3
세 손님 모두 동일한 시간대를 예약했기 때문에 3개의 방이 필요합니다.
import java.util.*;
class Solution {
public int solution(String[][] book_time) {
// book_time 배열을 정렬
Arrays.sort(book_time, new Comparator<String[]>() {
@Override
public int compare(String[] o1, String[] o2) {
// 입실시간이 동일한 경우 퇴실시간을 기준으로
// 입실시간이 다르다면 입실시간을 기준으로 오름차순 정렬
return o1[0].equals(o2[0]) ? o1[1].compareTo(o2[1]) : o1[0].compareTo(o2[0]);
}
});
int[][] time = new int[book_time.length][2];
for(int i = 0; i < book_time.length; i++) {
// 입실시간
int startTime = Integer.parseInt(book_time[i][0].replace(":", ""));
// 퇴실시간
int endTime = Integer.parseInt(book_time[i][1].replace(":", ""));
// 청소시간을 더해줌
endTime += 10;
// 청소시간을 더해서 60분이 넘어갔을 경우
if(endTime % 100 >= 60) {
endTime += 40;
}
time[i][0] = startTime;
time[i][1] = endTime;
}
// 예약에 따라 필요한 방을 생성하기 위한 배열
ArrayList<Integer> rooms = new ArrayList<>();
for(int i = 0; i < time.length; i++) {
// 배열을 정렬
Collections.sort(rooms);
// 새로운 방이 필요한지 여부
boolean isAdd = true;
for(int j = 0; j < rooms.size(); j++) {
// 기존에 있던 방들 중 입실이 가능한지 판단
if(time[i][0] >= rooms.get(j)) {
// 입실이 가능하다면 새로 입실이 가능한 시간을 저장
rooms.set(j, time[i][1]);
// 새로운 방이 필요없으니 값을 변경
isAdd = false;
break;
}
}
// 새로운 방이 필요한지 확인
if(isAdd) {
// 새로운 방을 추가
rooms.add(time[i][1]);
}
}
return rooms.size();
}
}
배열을 사용하여 진행하였다.
book_time 배열을 오름차순으로 정렬을 진행한다. 이때 입실시간이 동일한 경우 퇴실시간을 기준으로, 입실시간이 다르다면 입실시간을 기준으로 오름차순 정렬을 시켜준다.
모든 정렬이 끝난 뒤에 계산을 위해 모든 값을 int형으로 바꿔서 int형 배열에 저장해준다.
입실시간과 퇴실시간을 설정하는데 퇴실시간 이후 청소시간 10분이 추가로 필요하므로 퇴실시간 + 10을 해준다. 이때 청소시간을 더해서 60분이 넘어갔을 경우가 있다. 그럴 때 추가로 40을 더해준다.
예를 들어, 17:58분이 퇴실시간이면 1758이라는 값이 존재할 것이다. 이때 청소시간 10을 더해주면 1768이 된다. 하지만 17:58에서 10분을 더해주면 나와야하는 값은 18:08이므로 1768에서 40을 추가로 더해주는 것이다.
입실시간과 퇴실시간, 즉 다음 입실 가능 시간을 time 배열에 저장해준다.
이후 방을 생성하기 위해 ArrayList를 사용한다. rooms이라는 ArrayList는 필요한 방을 나타내며 매번 반복마다 배열을 정렬해준다.
새로운 방이 필요한지 여부를 저장할 boolean형 변수를 생성한다.
방을 하나하나 탐색하면서 기존에 있던 방들 중 입실이 가능한지 비교를 하고 입실이 가능하다면 퇴실시간과 청소시간을 저장해서 다른 사람이 새로 입실 가능한 시간으로 값을 변경해준다. 입실이 가능하므로 새로운 방은 필요없으니 isAdd를 false로 변경하고 반복문을 빠져나온다.
새로운 방이 필요한지 확인을 해서 새로운 방이 필요하다면 방을 추가해준다.
위의 과정을 반복해서 나온 ArrayList의 크기를 반환하면 문제를 해결할 수 있다!
최근에 풀었던 문제들 중 쉬운 편에 속했다. 시간은 60분을 기준으로 하기 때문에 값을 더해주는 부분에서 조금 헷갈렸다. 그래도 문제의 이해와 풀이가 쉬워서 실력이 많이 늘었구나 라는 기분을 느끼면서 문제를 풀 수 있었다. :)