알고리즘/프로그래머스

** 디스크 컨트롤러 **

베리영young 2024. 2. 20. 10:34
import java.util.*;

class Solution {
    public int solution(int[][] jobs) {
        int answer = 0;
        int count = 0; //몇 개나 수행함?
        int idx = 0; //현재 인덱스 어디?
        int end = 0; // 수행 직후 시간
        
        
        //들어오는 요청 순으로 소팅
        Arrays.sort(jobs, (o1, o2) -> o1[0] - o2[0]);
        
        //수행 시간 짧은 순으로 소팅
        PriorityQueue<int[]> pq = new PriorityQueue<>((o1, o2) -> o1[1] - o2[1]);
        
        //요청 끝날 때까지 반복
        while(count < jobs.length) {
            
            // end(시간) 전에 들어온 요청은 쌓아두기
            while(idx < jobs.length && jobs[idx][0] <= end) {
                //어차피 얘네는 다 계산하고 나갈 거니까 idx는 사정 없이 증가시키기
                pq.add(jobs[idx++]); 
            }
            
            //큐가 비었다 + 아직 다 수행 못함
            // => end를 지나서 들어온 요청이 있따?!?!
            if(pq.isEmpty()) {
                end = jobs[idx][0];
            }
            //큐가 비지 않았다! => 계산해라 노예야
            //우선순위큐 썼으니까 순서는 알아서 일 적은 애부터 들어감
            else{
                int[] tmp = pq.poll();
                //계산하렴 (들어왔을 때부터로 계산해야 하니까 -tmp[0] 잊지 말기)
                answer += tmp[1] + end - tmp[0];
                // 수행 끝나고 -> end 갱신
                end += tmp[1];
                // 수행 완료한 작업 +1
                count++;
            }
            
        }
        
        return (int) Math.floor(answer / jobs.length);
    }
}

 

 

어케 푸는데..ㅠ

 

1. 다 인덴스 소팅하는 방법... 람다식 외우기

 

차이:

나는 우선순위 큐에 1. 일의 양 오름차순 2. 일이 들어오는 순서 오름차순

이렇게 생가했었다ㅠ