본문 바로가기

알고리즘/프로그래머스

[프로그래머스] 디스크 컨트롤러 / JAVA

문제링크 : https://programmers.co.kr/learn/courses/30/lessons/42627

 

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

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

programmers.co.kr

import java.util.*;
class Solution {
    public static class Node{
        int startTime;
        int cost;
    }
    public static int solution(int[][] jobs) {
        int answer = 0;
        int N = jobs.length;
        
        PriorityQueue<Node> pq = new PriorityQueue<Node>(new Comparator<Node>() {
            @Override
            public int compare(Node o1, Node o2) {
                return o1.cost - o2.cost;
            }
        });
        Arrays.sort(jobs, new Comparator<int []>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                if(o1[0]==o2[0]){
                    return o1[1]-o2[1];
                }
                return o1[0] - o2[0];
            }
        });

        int nodeNum = 0;
        int curTime = 0;
        while(true){
            if(pq.isEmpty() && (nodeNum!=N)){
                Node newNode = new Node();
                newNode.cost = jobs[nodeNum][1];
                newNode.startTime = jobs[nodeNum][0];
                pq.add(newNode);
                nodeNum++;
                curTime = newNode.startTime;
            }
            if(pq.isEmpty()) break;
            while(!pq.isEmpty()){
                Node cur = pq.poll();
                answer += (curTime - cur.startTime + cur.cost);
                curTime += cur.cost;
                for(int i=nodeNum;i<N;i++){
                    nodeNum = i+1;
                    if(jobs[i][0] > curTime){
                        nodeNum = i;
                        break;
                    }
                    Node next = new Node();
                    next.startTime = jobs[i][0];
                    next.cost = jobs[i][1];
                    pq.add(next);
                }
            }

        }
        return answer / N;
    }
}