내가 일단 생각해본 과정은 다음과 같다.
1. 각 string형 데이터를 ":"를 제외시키고 숫자형으로 만들기
2. 종료 시간에는 10분을 더하기(청소시간)
3. 각 숫자를 배열로 선언하여 0번째에는 시작 시간을 1번째에는 종료 시간을 저장하기
4. 배열을 정렬하기
5. 반복문을 이용하여 현재 예약의 종료 시간과 다음 예약의 시작 시간을 비교
- 리스트를 활용할 생각이었음
- 종료 <= 시작 이라면 해당 인덱스의 값을 새로운 시작 값으로 바꿈
- 종료 > 시작 이라면 리스트에 새로운 칸을 하나 더함
여기서 내가 빼먹은건
1. 60분이 되면 1시간을 더하고 분은 초기화 해야한다는 것
- 시간을 제외한 분이 60이라면 +40을 해줌(ex - 1960 -> 2000)
2. 리스트로 처리할 경우 리스트 안에서 다시 반복문을 사용해야 한다는 점
- PriorityQueue를 사용하면 됨
- PriorityQueue는 트리 형태의 자료 구조로 작은 값이 맨 위에 위치함
- 따라서 따로 반복문을 돌리지 않아도 종료 시간이 가장 빠른 예약이 항상 맨 위에 위치하므로
맨 위의 값만 확인하면 됨
import java.util.*;
class Solution {
public int solution(String[][] book_time) {
int[][] arr = new int[book_time.length][book_time[0].length];
for(int i = 0; i < book_time.length; i++){
int start = Integer.parseInt(book_time[i][0].replace(":", ""));
int end = Integer.parseInt(book_time[i][1].replace(":",""));
end+=10;
if(end % 100 >= 60){
end+=40;
}
arr[i][0] = start;
arr[i][1] = end;
}
Arrays.sort(arr, (a,b) ->{
if(a[0]==b[0]){
return a[1] - b[1];
}
return a[0] - b[0];
});
PriorityQueue<Integer> rooms = new PriorityQueue<>();
for(int i = 0; i < arr.length; i++){
if(rooms.size() == 0){
rooms.add(arr[i][1]);
continue;
}
if(arr[i][0] >= rooms.peek()){
rooms.poll();
rooms.add(arr[i][1]);
}else{
rooms.add(arr[i][1]);
}
}
int answer = rooms.size();
return answer;
}
}