https://programmers.co.kr/learn/courses/30/lessons/42627
import java.util.*;
class Solution {
public int solution(int[][] jobs) {
Arrays.sort(jobs, (o1, o2) -> o1[0] - o2[0]);
int count = 0, last = -1, answer = 0, idx = 0, time = jobs[0][0];
PriorityQueue<int[]> q = new PriorityQueue<>((int[] o1, int[] o2) -> o1[1] - o2[1]);
while (count < jobs.length) {
for (int i = idx; i < jobs.length; i++) {
if (last < jobs[i][0] && jobs[i][0] <= time) {
q.offer(jobs[i]);
idx++;
}
else {
break;
}
}
if (q.size() > 0) {
count++;
last = time;
int[] job = q.poll();
time += job[1];
answer += (time - job[0]);
}
else {
time++;
}
}
return answer / jobs.length;
}
}
일단 jobs
를 작업이 요청되는 시점을 기준으로 오름차순 정렬을 하고 변수들을 선언해준다. count
는 작업을 수행한 수, last
는 직전 시간, answer
는 총 걸린시간, idx
는 job
을 힙에 넣을때 사용되는 인덱스, time
은 현재 시간 이다. 작업의 소요시간을 기준으로 정렬하는 힙을 선언하고 작업이 다 다실행될때까지 반복되는 while문에서 jobs
를 순회하며 현재 인덱스의 job
의 작업 요청되는 시점이 last
와 time
이내에 존재하면 힙에 넣는다. 그후 힙에 작업이 존재하면 count
증가, last
를 time
으로, time
에는 작업이 소요되는 시간을 더하고 answer
에는 time - job[0], 작업이 끝난시점 - 작업이 요청된 시점
을 더한다. 작업이 없으면 time
증가를 시킨다. 마지막에는 평균을 구해야하니 answer
에서 jobs
의 길이를 나누어 리턴하면 끝.