프로세스 처리 방식을 구현해보는 문제였다.
레디큐를 만들고 현재 들어온 작업중 실행시간이 가장 적게 걸리는 작업을 처리하면 되었다.
링크
package programmers;
import java.util.Arrays;
import java.util.PriorityQueue;
class Solution_디스크컨트롤러 {
// ready_queue 에 각 시간마다 넣고
// ready_queue 에서 예상 대기 시간이 가장 짧은 것 먼저 처리함
public int solution(int[][] jobs) {
Arrays.sort(jobs,(o1,o2)->{
return o1[0]-o2[0];
});
PriorityQueue<int[]> ready_queue=new PriorityQueue<>((o1,o2)->{
return o1[1]-o2[1];
});
int idx=0,time=0,ans=0,clear_cnt=0;
while(clear_cnt<jobs.length){
// put ready_queue
while(idx<jobs.length && jobs[idx][0]<=time){
ready_queue.offer(jobs[idx]);
idx++;
}
// running
if(!ready_queue.isEmpty()){
int[] now=ready_queue.poll();
// System.out.printf("%d,%d\n",now[0],now[1]);
clear_cnt++;
ans+=now[1]+time-now[0];
time+=now[1];
}
// 현재 ready_queue 에 넣을게 없을때
if(idx< jobs.length && jobs[idx][0]>time
&& ready_queue.isEmpty()){
time=jobs[idx][0];
}
}
ans/=jobs.length;
return ans;
}
}
public class 디스크컨트롤러 {
public static void main(String[] args) {
Solution_디스크컨트롤러 sol=new Solution_디스크컨트롤러();
int[][] jobs={{0,3},{1,9},{2,6}};
int ans=sol.solution(jobs);
System.out.println(ans);
}
}