プログラマ[ディスクコントローラ]
11639 ワード
ディスクコントローラ
問題の説明
HDDは一度に1台しか処理できません.ディスクコントローラを実装する方法はいくつかあります.最も一般的な方法は、リクエストの受信順序に従って処理することである.
例:
受け取った要求は同じです.下図のように.
各タスクの要求から終了までの平均時間は10ミリ秒(=(3+11+16)/3)である.
A→C→Bの順に処理すると,各タスクの要求から終了までの平均時間は9 ms(=(3+7+17)/3)となる.
せいげんじょうけん
jobsの長さは1または500以下です.
ジョブの各行は、タスクの[タスクを要求する時間、タスクに要する時間]です.
各タスクについて、タスクを要求する時間は1000を超えません.
各タスクに要する時間は1000時間を超えない.
ハードディスク(HDD)が動作していない場合は、リクエストのタスクを先に処理します.
I/O例
jobs return
[[0, 3], [1, 9], [2, 6]] 9
I/O例説明
問題の例は以下の通りです.
タスクリクエストは、0ミリ秒の時点で3ミリ秒受信されます.
1ミリ秒の時点で9ミリ秒のタスクリクエストを受信します.
2ミリ秒の時点で6ミリ秒のタスクリクエストを受信します.
import java.util.*;
class Solution {
public static int solution(int[][] jobs) {
Arrays.sort(jobs, new Comparator<int[]>() {
public int compare(int[] o1, int[] o2) {
if(o1[0] <= o2[0]){
return -1;
}
return 1;
}
});
PriorityQueue<int[]> queue = new PriorityQueue<int[]>(new Comparator<int[]>() {
public int compare(int[] o1, int[] o2) {
if(o1[1] < o2[1]){
return -1;
}
return 1;
}
});
int time = 0;
int index = 0;
float answer = 0;
while(true){
while(index < jobs.length && jobs[index][0] <= time){
queue.offer(jobs[index]);
index ++;
}
if(queue.size() == 0){
time = jobs[index][0];
continue;
}
int[] job = queue.poll();
time += job[1];
answer += time - job[0];
if(index == jobs.length && queue.size() == 0){
break;
}
}
answer /= jobs.length;
return (int)answer;
}
}
Reference
この問題について(プログラマ[ディスクコントローラ]), 我々は、より多くの情報をここで見つけました https://velog.io/@wijihoon123/programmers-디스크-컨트롤러テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol