https://school.programmers.co.kr/learn/courses/30/lessons/155651
우선, 주어진 입력이 "HH-MM" 형식으로 되어 있기 때문에, 24시간을 1440분이라고 보고, 이를 정수로 전환해준다.
모든 예약 정보를 PriorityQueue에 넣고, 시작 시간을 기준으로 오름차순 정렬을 해준다. 그 다음, ArrayList를 하나 만들어서 각 방의 대실 종료 시간을 저장해준다. 이후, PriorityQueue에서 Booking 데이터를 하나씩 빼면서 리스트에서 해당 대실 시간에 가능한 방이 있는지 확인한다. 가능한 방이 있으면 그 방의 대실 종료 시간을 업데이트 해주고, 없을 경우에는 새로운 방을 하나 추가한다.
모든 과정이 종료된 후에, ArrayList의 크기가 필요한 방의 최소 개수가 될 것이다.
import java.util.*;
class Solution {
static class Booking {
private int start;
private int end;
public Booking(int start, int end) {
this.start = start;
this.end = end;
}
}
public int solution(String[][] book_time) {
PriorityQueue<Booking> pq = new PriorityQueue<>((o1, o2) -> (o1.start - o2.start));
for(int i = 0; i < book_time.length; i++) {
int start_h = Integer.parseInt(book_time[i][0].split(":")[0]);
int start_m = Integer.parseInt(book_time[i][0].split(":")[1]);
int end_h = Integer.parseInt(book_time[i][1].split(":")[0]);
int end_m = Integer.parseInt(book_time[i][1].split(":")[1]);
int start = (start_h * 60) + start_m;
int end = (end_h * 60) + end_m;
pq.add(new Booking(start, end));
}
List<Integer> end_times = new ArrayList<>();
while(!pq.isEmpty()) {
Booking b = pq.poll();
int start = b.start;
int end = b.end;
boolean isAvailable = false;
Collections.sort(end_times);
for(int i = 0; i < end_times.size(); i++) {
if(end_times.get(i) + 10 <= start) {
isAvailable = true;
end_times.set(i, end);
break;
}
}
if(!isAvailable) {
end_times.add(end);
}
}
return end_times.size();
}
}