본문 바로가기
Algorithm/프로그래머스풀이

[알고리즘 문제풀이] 프로그래머스 - 디스크 컨트롤러 / JAVA(자바)

by 계범 2022. 3. 21.

목차

    https://programmers.co.kr/learn/courses/30/lessons/42627

     

    코딩테스트 연습 - 디스크 컨트롤러

    하드디스크는 한 번에 하나의 작업만 수행할 수 있습니다. 디스크 컨트롤러를 구현하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 요청이 들어온 순서대로 처리하는 것입니다. 예를

    programmers.co.kr

    /**
        1. 작업의 요청부터 종료까지 걸린 시간의 평균을 가장 줄이는 방법으로 평균 반환
        1-1) 같은 시간에 요청중인 작업이 있다면 적은 작업시간부터 할 것!(sjf)
        
        2. 현재 작업시작시간과 끝나는 시간을 표기해두고, 그안에 요청 들어온 작업들을 하나씩 처리하는 형태로 구현.
        
        3. 우선순위큐에 요청시간 순 정렬해서 넣어두고, 그시간에 맞는 요청들을 하나씩 빼서 우선순위 대기큐에 넣어서 처리.
        
        4. 처리할때마다 작업종료시간-요청시간을 정답에 넣어두고, 작업개수로 나눠서 정답 반환.
    **/
    
    import java.util.*;
    
    class Solution {
        public int solution(int[][] jobs) {
            int answer = 0;
            
            PriorityQueue<int[]> q = new PriorityQueue<>((o1,o2) -> o1[0] - o2[0]);
            
            for(int[] job : jobs){
                int demand = job[0];
                int time = job[1];
                
                q.offer(new int[] {demand,time});
            }
            
            int before = -1; // 작업시작시간
            int after = 0; // 작업종료시간
            int cnt = 0; // 작업완료한 개수
            PriorityQueue<int[]> readyQ = new PriorityQueue<>((o1,o2) -> o1[1] - o2[1]);
            
            while(cnt < jobs.length){
                
                while(!q.isEmpty()){
                    int[] cur = q.peek();
                    int demand = cur[0];
                    int time = cur[1];
    
                    // 이작업이 시작한 이후면서 종료전에 들어왔으면 대기큐에 넣기.
                    if(before < demand && demand <= after){
                        readyQ.offer(q.poll());
                    }else{
                        break;
                    }
                }
                
                //대기중인 작업이 없으면 시간 증가 후 다시 확인.
                if(readyQ.isEmpty()){
                    after++;
                    continue;
                }
                
                int[] task = readyQ.poll();
                int demand = task[0];
                int time = task[1];
                
                before = after;
                after += time;
                answer += after - demand;
                cnt++;
            }
            
            return answer/cnt;
        }
    }

    댓글