이 문제는 스케쥴링 알고리즘 중 하나인 SJF 알고리즘을 구현하는 문제였다.
원래는 실행 전에는 실행 시간(작업 시간)을 알 수 없지만 이 문제에서는 미리 주어지기 때문에 신경쓸 필요가 없다. 어렵지 않은 문제이나 이상한 곳에 꽂혀서 시간을 엄청나게 허비했다.
import java.util.*;
class Solution {
class Job {
int requestTime;
int workingTime;
Job(int requestTime, int workingTime){
this.requestTime = requestTime;
this.workingTime = workingTime;
}
}
public int solution(int[][] jobs) {
LinkedList<Job> waiting = new LinkedList<>();
PriorityQueue<Job> pq = new PriorityQueue<>(new Comparator<Job>() {
@Override
public int compare(Job j1, Job j2) {
return j1.workingTime - j2.workingTime;
}
});
for(int[] job : jobs) {
waiting.offer(new Job(job[0], job[1]));
}
Collections.sort(waiting, new Comparator<Job>() {
@Override
public int compare(Job j1, Job j2) {
return j1.requestTime - j2.requestTime;
}
});
int answer = 0;
int cnt = 0;
int time = waiting.peek().requestTime;
while(cnt < jobs.length) {
while(!waiting.isEmpty() && waiting.peek().requestTime <= time) {
pq.offer(waiting.pollFirst());
}
if(!pq.isEmpty()) {
Job job = pq.poll();
time += job.workingTime;
answer += time - job.requestTime;
cnt++;
} else {
time++;
}
}
return answer / cnt;
}
}