알고리즘 종류 : Greedy
book_time은 [["15:00","17:00"], ["16:40", "18:20"]] 형식으로 구성되어 있으므로 먼저 timeInt 배열을 생성하여 모두 분으로 변경한다. 이 때 청소에 10분씩 걸리므로 end값에 10분도 더해줌.
timeInt 예시 - [[800, 1030], [1000, 1110]]
timeInt배열을 시작시간 기준으로 정렬, 동일한 경우 종료시간 기준으로 정렬해줌.
PriorityQueue를 생성하여 현재 가장 빨리 퇴실하는 방의 퇴실시간보다 새로운 손님의 예약시간이 더 작을 경우 새로운 방 생성(que에 종료시간 추가, 방 생성)
그렇지 않을 경우 현재 가장 빨리 퇴실하는 방의 퇴실시간을 새로운 손님의 퇴실시간으로 변경(que에서 하나 꺼내고, 새로운 퇴실시간 추가)
import java.util.*;
class Solution {
public int solution(String[][] book_time) {
//새로 시간을 가공해서 담을 배열
int[][] timeInt = new int[book_time.length][2];
for(int i=0; i<book_time.length; i++){
timeInt[i][0] = Integer.parseInt(book_time[i][0].split(":")[0])*60+
Integer.parseInt(book_time[i][0].split(":")[1]);
timeInt[i][1] = Integer.parseInt(book_time[i][1].split(":")[0])*60+
Integer.parseInt(book_time[i][1].split(":")[1])+10;
}
// 예약시간 기준으로 정렬, (동일한 경우 종료시간 기준 정렬)
Arrays.sort(timeInt, (o1, o2) -> {
if(o1[0]==o2[0]){
return o1[1]-o2[1];
}return o1[0]-o2[0];
});
// 무조건 방은 1개 있으므로 1부터 시작
PriorityQueue<Integer> pq = new PriorityQueue();
int answer = 1;
pq.add(timeInt[0][1]);
//방을 돌면서 새로운 방을 생성할지 원래 방에서 예약을 받을지 결정
for(int i=1; i<timeInt.length; i++){
if(timeInt[i][0]<pq.peek()){ //새로운 방을 받아야하는 경우
pq.add(timeInt[i][1]);
answer++;
}else{ //원래 있던 방을 받을 경우
pq.poll();
pq.add(timeInt[i][1]);
}
}
return answer;
}
}
보통 코딩테스트 문제에서 정렬을 해야하는 경우가 자주 나오는데 정렬에 대해 정리해보자.
오름차순 정렬 시
* Primitive type - int, double과 같은 소문자로 시작하는 타입, 참조 자료형이 아닌 타입
사용자 정의 정렬
Arrays.sort(timeInt, (o1, o2) -> {
if(o1[0]==o2[0]){
return o1[1]-o2[1];
}return o1[0]-o2[0];
});
대체로 Comparator나 Comparable 사용방법을 자주 까먹어서 문서를 찾아보고는 했는데 람다문법은 잊지 않을 수 있을 것 같다. 그래도 두 정렬방법의 정의나 차이점, 사용법은 꼭 기억해야 하므로 다음에 한번 다뤄보도록 해야지.