function solution(jobs) {
// 먼저 요청 시간순으로 오름차순 정리한다.
jobs.sort((a,b) => a[0] - b[0]);
// 작업들을 빼내기 전에 미리 총 작업 수를 구한다.
const jobsNum = jobs.length;
// 작업이 진행되는 동안 요청으로 들어온 작업들을
// 대기시키기 위한 queue
let queue = [];
// 각 작업이 종료된 시간
let end = 0;
// 각 작업의 요청부터 종료까지의 총합
let sum = 0;
// 모든 작업들을 queue에 올리고 queue에서 모든 작업이
// 종료되면 반복문 종료.
// 어떠한 작업이 종료되고 난 후에 요청이 들어오면
// queue가 비어있기 때문에 jobs길이 까지 고려.
while(queue.length || jobs.length) {
// jobs를 요청 시간순으로 정렬해뒀기 떄문에
// 진행중인 작업의 종료시간 전에 들어온 모든
// 요청을 queue에 적재.
while(jobs[0] && jobs[0][0] <= end) {
queue.push(jobs.shift());
}
// 작업 요청이 늦어 queue가 비어있을 경우
// 시간만 증가.
if(!queue.length) {
end++;
continue;
}
// queue에 있는 모든 작업들을 작업시간 기준
// 오름차순 정렬
queue.sort((a,b) => a[1] - b[1]);
// 작업이 종료된 후 quque에서 제거
const [from,to] = queue.shift();
// 종료시간 업데이트
end += to;
// 요청~완료 시간 누적
sum += end-from;
}
// 평균시간 정수로 반환.
return parseInt(sum / jobsNum);
}
어떠한 작업이 시작부터 끝나는 순간까지 요청으로 들어온 모든 작업들 중 처리시간이 가장 짧은 작업을 다음 작업으로 처리해야 평균을 가장 줄일 수 있다.