
우연히도 PriorityQueue를 배우자 마자 써먹을 기회가 생긴 것 같다.
회의실 관련 문제는 이렇게 접근하면 된다.
1. 회의 전체를 시작시간 순서대로, 시작 시간이 동일하다면 끝나는 시간 순서대로 정렬한다.
2. PriorityQueue를 만들어서 끝나는 시간 기준 오름차순으로 설정한다 (제일 빨리 끝나는 회의가 필요하기 때문)
3. 회의 전체의 while문을 돌려서 만약 회의 시작 시간 기준 끝난 회의가 있다면 pq를 모두 poll해준다
4. pq에 offer 해준다
5. result = Math.max(result, pq.size())를 해준다
다만 시간이 String으로 되어있고 사용하기 불편했기 때문에 나같은 경우에는 시간이 있다면 :를 떼어버리고 parseInt를 해줬다.이럴 경우에는 00 : 50 ~ 00 : 59분일때의 작업이 필요했다. (청소시간이 10분 주어지기 때문,.)
이럴 경우 다음과 같은 삼항연산자로 해결할 수 있었다.
((pq.peek().end % 100 >= 50) ?
pq.peek().end / 100 * 100 + 100 + pq.peek().end % 10 : pq.peek().end + 10)
답안
package programers;
import java.util.ArrayList;
import java.util.List;
import java.util.PriorityQueue;
public class Pro_호텔대실 {
public static int solution(String[][] book_time) {
int answer = 1;
List<MeetingHo> meet = new ArrayList<>();
for(String[] book : book_time) {
meet.add(new MeetingHo(book[0], book[1]));
}
meet.sort((o1, o2) -> {
if(o1.start == o2.start) {
return o1.end - o2.end;
}
return o1.start - o2.start;
});
PriorityQueue<MeetingHo> pq = new PriorityQueue<>((o1, o2) -> {
return o1.end - o2.end;
});
for(MeetingHo m: meet) {
if(pq.isEmpty()) {
pq.offer(m);
continue;
}
while(!pq.isEmpty() && ((pq.peek().end % 100 >= 50) ?
pq.peek().end / 100 * 100 + 100 + pq.peek().end % 10 : pq.peek().end + 10) <= m.start) pq.poll();
pq.offer(m);
answer = Math.max(answer, pq.size());
}
return answer;
}
}
class MeetingHo {
int start;
int end;
public MeetingHo(String start, String end) {
this.start = Integer.parseInt(start.substring(0,2) + start.substring(3,5));
this.end = Integer.parseInt(end.substring(0,2) + end.substring(3,5));
}
}
'프로그래머스 AND 백준 > java' 카테고리의 다른 글
백준 14889 스타트와 링크 java (0) | 2024.04.29 |
---|---|
비트마스크 (0) | 2024.04.11 |
백준9019_DSLR (0) | 2024.04.11 |
프로그래머스 - 석유시추 (0) | 2024.03.25 |
백준 2573번 (1) | 2024.03.24 |