[プログラマ]レベル3-ディスク制御(js)


📌質問する


プログラマ-ディスク制御
問題では、パラメータ化された2 D配列ジョブ(タスクを要求する時間、タスクの時間)は、次のように要求されます.
タスクのリクエストから終了までの平均時間を最短で処理する場合は、平均値を返すソリューション関数を作成します.(ただし小数点以下)
問題の核心は、タスクが完了する前にすでに開始されているかどうかに基づいて、要求から終了までの時間を最小限に抑えるために、必要な時間順にソートすることです.

📌マイコード

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)
};