문제에서 [작업이 요청되는 시점, 작업의 소요시간]을 담은 2차원 배열 jobs가 매개변수로 주어지는데 요구사항은 다음과 같다.
작업의 요청부터 종료까지 걸린 시간의 평균을 가장 줄이는 방법으로 처리하면 평균이 얼마가 되는지 return 하도록 solution 함수를 작성해주세요. (단, 소수점 이하의 수는 버립니다)
문제의 핵심은 한 작업이 끝나기 전에 시작되는 작업이 있는가에 따라 소요시간 순서대로 정렬하여 요청부터 종료까지 걸린시간을 최소화하는 것이다.
function solution(jobs) {
let l = jobs.length; // 작업의 수
let totalTime = 0; // 총 시간
let duration = 0; // 요청부터 종료까지 걸린 시간의 합
let disk = []; // 작업 실행부 배열
// 시작시간 순서대로 오름차순 정렬
jobs.sort((a, b) => a[0] - b[0])
// jobs나 disk(작업 실행부)에 작업이 있으면 반복
while (jobs.length || disk.length) {
// 작업이 있고, 첫 작업의 시작시간이 총 시간보다 작거나 같을 때 반복(예제처럼 한 작업의 종료시간 전에 시작하는 작업이 있을 때)
while (jobs[0] && jobs[0][0] <= totalTime) {
const temp = jobs.shift();
disk.push(temp);
}
// 소요시간이 작은 것부터 오름차순으로 정렬
disk.sort((a, b) => a[1] - b[1])
if (disk.length) {
const temp = disk.shift();
// 총시간 = [이전의 총시간 + 소요시간]
totalTime = totalTime + temp[1];
// 요청부터 종료까지 걸린시간 = [총시간 - 현재 작업의 시작시간]
duration += totalTime - temp[0];
} else {
// 만약 작업 사이에 텀이 있으면, 현재 작업의 시작시간으로 초기화
// 예로, 이전 작업이 3ms에 끝났고, 새로운 작업이 4ms에 시작되면 totalTime을 4로 초기화
totalTime = jobs[0][0];
}
}
return Math.floor(duration / l)
};