[programmers] 디스크 컨트롤러

KwonSC·2022년 4월 6일
0

programmers - Java

목록 보기
10/17
post-thumbnail

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


Code

import java.util.*;

class Solution {
    public int solution(int[][] jobs) {
        Arrays.sort(jobs, (o1, o2) -> o1[0] - o2[0]);
        int count = 0, last = -1, answer = 0, idx = 0, time = jobs[0][0];
        PriorityQueue<int[]> q = new PriorityQueue<>((int[] o1, int[] o2) -> o1[1] - o2[1]);
        while (count < jobs.length) {
            for (int i = idx; i < jobs.length; i++) {
                if (last < jobs[i][0] && jobs[i][0] <= time) {
                    q.offer(jobs[i]);
                    idx++;
                }
                else {
                    break;
                }
            }
            if (q.size() > 0) {
                count++;
                last = time;
                int[] job = q.poll();
                time += job[1];
                answer += (time - job[0]);
            }
            else {
                time++;
            }
        }
        return answer / jobs.length;
    }
}

Solution

일단 jobs를 작업이 요청되는 시점을 기준으로 오름차순 정렬을 하고 변수들을 선언해준다. count는 작업을 수행한 수, last는 직전 시간, answer는 총 걸린시간, idxjob을 힙에 넣을때 사용되는 인덱스, time은 현재 시간 이다. 작업의 소요시간을 기준으로 정렬하는 힙을 선언하고 작업이 다 다실행될때까지 반복되는 while문에서 jobs를 순회하며 현재 인덱스의 job의 작업 요청되는 시점이 lasttime이내에 존재하면 힙에 넣는다. 그후 힙에 작업이 존재하면 count증가, lasttime으로, time에는 작업이 소요되는 시간을 더하고 answer에는 time - job[0], 작업이 끝난시점 - 작업이 요청된 시점을 더한다. 작업이 없으면 time증가를 시킨다. 마지막에는 평균을 구해야하니 answer에서 jobs의 길이를 나누어 리턴하면 끝.

0개의 댓글