[알고리즘] 프로그래머스 디스크 컨트롤

shininghyunho·2022년 3월 7일
0

문제

프로세스 처리 방식을 구현해보는 문제였다.
레디큐를 만들고 현재 들어온 작업중 실행시간이 가장 적게 걸리는 작업을 처리하면 되었다.
링크

Code

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);
    }
}
profile
shining itself

0개의 댓글

관련 채용 정보