Queue라기 보다는 배열을 효과적으로 사용해야만 풀 수 있는 문제 이다.
주의해야할 점들을 먼저 모두 작성해보았다.
const solution = (jobs) => {
let answer = 0;
jobs.sort((a, b) => a[0] - b[0]); // 시작 시점을 기준으로 정렬한다
let i =0; // index
let time = 0; // 현재까지 수행하고 시작해야 하는 시간
const Queue = []; // 다음 들어갈 업무를 담습니다.
// 순회를 하면서 추가 합니다. 그리고 Queue가 다 비워질 때까지 기다립니다.
while (i < jobs.length || Queue.length !== 0) {
if ( i<jobs.length && jobs[i][0] <=time) {
// 첫시행에서 바로 추가가됩니다. 현재 시간이 0이기 떄문
// 근데 첫 시작이 0이 아니면 바로 아래로 내려감
Queue.push(jobs[i]);
i++;
Queue.sort((a, b) => a[1] - b[1]); // 시간이 적은 순서로 정렬시킵니다. 가장 작은 값
}
else if (Queue.length !== 0) { // queue에 값이 있다면,
const [curStartTime , curTime] = Queue.shift();
time += curTime; // 소요시간만큼 추가합니다.
answer += time - curStartTime // 이때, 최종적으로 이동하게 된 시간 만큼 이동한다.
} else { // queue에 아무값도 없으며, time이 현제 시점의 jobs보다 빠른경우 -> 이 경우에는 바로 시작해야 한다.
time = jobs[i][0];
}
}
return parseInt(answer / jobs.length);
};