문제 링크 - https://school.programmers.co.kr/learn/courses/30/lessons/42627
(8,2) (4,9), (6,3) (7,5)
와 같은 작업4개가 추가로 더 존재한다고 생각하자.(8,2) (4,9), (6,3) (7,5)
와 같은 작업 4개의 요청시점은 작업C가 끝나는 시점(9)보다 작기 때문에 작업 C의 처리가 끝난 후, 다음 작업으로 선택할 수 있는 후보가 된다. 작업의 소요시간 기준
으로 오름차순으로 우선순위가 결정되는 큐이다.(8,2) (4,9) (6,3) (7,5)
순서를 갖게되고, 가장 우선순위 높은 것을 처리한다. 처리하면서 또 작업(8,2)가 끝나기 전에 요청된 작업들을 우선순위 큐에 넣는 과정을 반복한다.import java.util.*;
class Solution {
public int solution(int[][] jobs) {
int n =jobs.length;
Arrays.sort(jobs, new Comparator<int[]>(){ // 요청된 시간 기준 오름차순 정렬, 같다면 소요시간이 적은 순서대로.( 두번째 조건 안하면 테케하나 틀림)
@Override
public int compare(int[] arr1, int[] arr2){
if(arr1[0]==arr2[0])
return arr1[1]-arr2[1];
return arr1[0]-arr2[0];
}
});
//작업의 소요시간 기준 오름차순 정렬
PriorityQueue<int[]> pq = new PriorityQueue<>(new Comparator<int[]>(){
@Override
public int compare(int[] arr1, int[] arr2){
return arr1[1]-arr2[1];
}
});
pq.offer(jobs[0]); //제일 처음 수행되는 작업 넣기
int index=1; // 0번째는 넣었으니까 1번째부터 인덱스 시작
int end=jobs[0][0]; // end: 현재 시간 흐름
int sum=0;
while(!pq.isEmpty()){ // 모든 작업이 끝날때까지 반복
int[] cur = pq.poll(); // 현재 수행되는 작업
end+=cur[1]; // 시간의 흐름: 현재 수행되는 작업이 끝난시점
sum+=end-cur[0]; // 현재 작업의 (끝난시점)-(요쳥된시점) 만큼 sum에 더해줌
while(index<n && jobs[index][0]<end ){ // while문안의 조건 순서 주의. (순서 다르면 index가 jobs의 범위밖으로 나가는 순간 런타임에러)
pq.offer(jobs[index++]); // 전에 처리되던 작업이 처리되는 동안, 요청되었기 때문에 pq에 넣어주기.
}
if(index<n && pq.isEmpty()){ // pq가 비어있다는것은 직전 작업이 끝고 나서, 다음 작업이 수행됨.
end=jobs[index][0]; // 시간의 흐름은 그다음 작업의 시작시간으로 이동.
pq.offer(jobs[index++]); // 다음 수행할 작업 넣어주기
}
}
System.out.println("sum: "+sum);
return sum/n;
}
}