import java.util.*;
class Solution {
public int solution(int[][] jobs) {
// // 원본 배열 오름차순 정렬 (요청시간 오름차순)
Arrays.sort(jobs, (o1, o2) -> o1[0] - o2[0]);
// 처리 시간 오름차순으로 정렬되는 우선순위 큐(Heap)
PriorityQueue<int[]> pq = new PriorityQueue<>((o1, o2) -> o1[1] - o2[1]);
int currentTime = 0; // 수행되고난 직후의 시간
int totalWaitTime = 0;
int completedJobs = 0; // 수행된 요청 갯수
int index = 0; // jobs 배열의 인덱스
// 요청이 모두 수행될 때까지 반복
while (completedJobs < jobs.length) {
// 하나의 작업이 완료되는 시점(currentTime)까지 들어온 모든 요청을 큐에 넣음
while (index < jobs.length && jobs[index][0] <= currentTime) {
pq.offer(jobs[index]);
index++;
}
// 작업이 끝나기 전(currentTime 이전) 들어온 요청 중 가장 수행시간이 짧은 요청부터 수행
if (!pq.isEmpty()) {
int[] job = pq.poll();
currentTime += job[1];
totalWaitTime += currentTime - job[0];
completedJobs++;
// (currentTime를 요청의 가장 처음으로 맞춰줌)
} else {
currentTime = jobs[index][0];
}
}
return totalWaitTime / jobs.length;
}
}
Arrays.sort(jobs, (o1, o2) -> o1[0] - o2[0]);
PriorityQueue<int[]> queue = new PriorityQueue<>((o1, o2) -> o1[1] - o2[1]);
Arrays.sort(jobs, new Comparator<int[]>() {
public int compare(int[] o1, int[] o2) {
if(o1[0] <= o2[0]){
return -1;
}
return 1;
}
});
PriorityQueue<int[]> queue = new PriorityQueue<int[]>(new Comparator<int[]>() {
public int compare(int[] o1, int[] o2) {
if(o1[1] < o2[1]){
return -1;
}
return 1;
}
});
https://school.programmers.co.kr/learn/courses/30/lessons/42627