1353 - Maximum Number of Events That Can Be Attended
info
- 문제 보기: 1353 - Maximum Number of Events That Can Be Attended
- 소요 시간: 25분 19초
- 풀이 언어:
java - 체감 난이도: 3️⃣
- 리뷰 횟수: ✅
풀이 키워드
스포주의
정렬 그리디 힙
풀이 코드
info
- 메모리: 76130 KB
- 시간: 63 ms
class Solution {
public int maxEvents(int[][] events) {
// sort by start day
Arrays.sort(events, (a, b) -> a[0] - b[0]);
// sort by end day
PriorityQueue<Integer> pq = new PriorityQueue<>();
int n = events.length;
int idx = 0;
int today = 1;
int ans = 0;
while (idx < n || !pq.isEmpty()) {
// more events upcoming but none exists for today
if (pq.isEmpty()) today = events[idx][0];
// can attend today
while (idx < n && events[idx][0] <= today) {
pq.add(events[idx++][1]); // sort by end day
}
pq.poll(); // attend
++ans;
++today; // set to next day
// remove expired events
while (!pq.isEmpty() && pq.peek() < today) {
pq.poll();
}
}
return ans;
}
}
풀이 해설
여러 이벤트의 start day, end day가 주어지고, 하루 당 이벤트 하나씩만 참여 가능할 때,
참여할 수 있는 최대 이벤트 수를 구하는 문제이다.
이는 전형적인 그리디 유형으로 정렬 기준이 2가지이므로
start day로 오름차순 정렬 한 번 거친 후 end day를 기준으로 최소힙을 사용하면 된다.