Don't give up!

[프로그래머스] 디스크 컨트롤러(java) 본문

Coding Test/Programmers

[프로그래머스] 디스크 컨트롤러(java)

Heang Lee 2021. 5. 25. 23:59

코딩테스트 연습 - 디스크 컨트롤러 | 프로그래머스 (programmers.co.kr)

 

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

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

programmers.co.kr

어떻게 생각하고 문제를 풀었는가?

주어진 작업들 중 소요시간이 짧은 작업을 먼저 수행하는 그리디 알고리즘으로 문제를 해결할 수 있을 것이라고 생각하였습니다.

작업의 수행은 LIFO의 자료구조인 Queue를 사용하고자 하였고, 작업 수행시간에 따른 정렬을 수행할 수 있는 PriorityQueue를 이용하는 것이 좋다는 생각을 하였습니다.

 

코드

import java.util.*;
class Solution {
    public int solution(int[][] jobs) {
        int answer=0, index=0, time=0, count=0;
        Arrays.sort(jobs,(a,b) -> a[0]-b[0]);
        PriorityQueue<int[]> process = new PriorityQueue<>(512,(x,y) ->x[1]-y[1]);
        time = jobs[0][0];
        while(count<jobs.length){
            while(index<jobs.length&&time>=jobs[index][0]){
                process.offer(jobs[index++]);
            }
            if(!process.isEmpty()){
                int[] current = process.poll();
                time+=current[1];
                answer+=time-current[0];
                count++;
            }else{
                time = jobs[index][0];
            }
        }
        return answer/jobs.length;
    }
}

테스트를 통과하는 코드를 작성하였습니다.

PriorityQueue는 생성자에 Comparator를 매개변수로 받아 원소의 순서 비교를 할 수 있습니다.

모든 작업들을 요청시간에 따라 정렬한 후, 받을 수 있는 작업들을 모두 큐에 삽입, 소요시간 순서에 따라 작업을 수행함으로서 요청 - 완료까지 걸리는 평균 시간의 최소 값을 얻을 수 있습니다.