각 작업의 “요청 ~ 종료”까지 걸린 시간의 평균을 가장 많이 줄이는 방법으로 처리하면 평균이 얼마나 될까?
문제에서는 평균 turnaround time 의 최소값을 얻는 방법으로 처리하였을 때 그 결과가 얼마인지를 묻고 있다.
( 다른 사람 풀이까지해서 거의 3시간 30분..ㅠㅠ)
그냥 SJF를 해보자
주어지는 정보의 형태 : ( 요청시간, 작업시간 )
Priority Queue에 넣는다. ( 우선순위 : “작업시간” - 짧을 수록 우선순위가 높도록 → minHeap )
어떤 task를 s ~ s +t 시간까지 실행한다면
어떤 작업의 turnaround time : 현재시간 - 요청 시간 + 작업시간
엄청 깔끔한듯
while(jobs[jobIdx][0] <= end)
pq.add( jobs[jobIdx++]);
import java.util.*;
class Solution {
// Ready queue 는 처리시간 기준으로만 minHeap
public static PriorityQueue<int[]> q = new PriorityQueue<>(new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[1]-o2[1];
}
});
// SJF 라면?
public int solution(int[][] jobs) {
int answer = 0;
int count = 0, end = 0, jobIdx = 0, sum = 0 , len = jobs.length;
int[] task = null; // pq 에서 꺼낸 작업 ( 현재처리할 작업)
// 요청시간을 기준으로 오름차순 정렬
Arrays.sort(jobs,(o1,o2)->{
return o1[0]-o2[0];
});
// count 는 처리한 요청의 개수
while(count<len){
// 요청시간 <= end 인 job들을 q 에 넣는다 (이 때 jobIdx 의 범위에 주의)
while(jobIdx<len && jobs[jobIdx][0]<=end){
q.add(jobs[jobIdx++]);
}
// 그래도 pq가 비어있으면 end를 업데이트한다
if(q.isEmpty()) end = jobs[jobIdx][0];
else{
// 작업을 하나 처리한다
task = q.poll();
sum += (end - task[0] + task[1]);
end += task[1];
count++;
}
}
answer = sum/len;
return answer;
}
}