Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

Life Engineering

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

Problem Solving

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

흑개 2022. 5. 14. 00:41

https://programmers.co.kr/learn/courses/30/lessons/42627?language=java# 

 

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

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

programmers.co.kr

import java.util.*;

class Solution {
    public int solution(int[][] jobs) {
        int answer = 0, time=0;
        PriorityQueue<int[]> req=new PriorityQueue<>(new Comparator<int[]>(){  //요청시간 빠른순으로, 같을 때에는 소요시간 적은 순으로
            public int compare(int[] a, int[] b){
                if (a[0]==b[0]){
                    return Integer.compare(a[1], b[1]);
                }
                return Integer.compare(a[0], b[0]);
            }
        });    
        PriorityQueue<int[]> work=new PriorityQueue<>(new Comparator<int[]>(){  //소요시간 적은 순으로, 같을 때에는 요청시간 빠른 순으로
            public int compare(int[] a, int[] b){
                if (a[1]==b[1]){
                    return Integer.compare(a[0], b[0]);
                }
                return Integer.compare(a[1], b[1]);
            }
        });    
        for (int i=0; i<jobs.length; i++){
            req.add(jobs[i]);       //job들을 다 넣어준 후 요청시간 빠른 순으로 뽑아올 수 있도록
        }
        while (!work.isEmpty() || !req.isEmpty()){
            if (work.isEmpty()){                //한참 있다가 작업이 요청될 때
                work.add(req.poll());
                time=work.peek()[0]; //시간은 그 요청시간으로 당겨준다
            }
            int[] job=work.poll();  //대기 job 중 소요시간이 짧은 애들 선택
            answer+=(time-job[0]+job[1]);
            time+=job[1]; 
            while (!req.isEmpty()){
                if (req.peek()[0]<=time){
                    work.add(req.poll());
                }
                else{
                    break;
                }
            }
        }
        return answer/jobs.length;
    }
}

조금 복잡하게 푼 것 같다 ..

 

jobs를 요청 시간이 빠른 순으로 req에 넣고 (요청시간 같을 때는 소요시간 빠른 쪽으로)

또 소요시간 빠른 순대로 저장하는 work가 있다.

 

두 큐가 모두 빌때까지, work에서 뽑아오고, 현재 시간까지 요청이 온 애들을 req에서 뽑아 work에 넣어주는 식이다.

work가 비었지만, req가 아직 비지 않은 경우 디스크 컨트롤러가 일을 하지 않았을 때이므로 시간을 그때로 당겨주고, work 큐에 넣어준다.

 

 

다른 분들(https://codevang.tistory.com/316)

의 코드를 보니, pq를 2개 쓸 필요 없이 원본 배열을 요청 시간 순대로 오름차순 배열 해주고,

요청이 모두 수행될 때까지 원본 배열을 가리키는 jobIdx 를 이용하여 현재 시간까지 요청된 애들을 pq에 넣고, pq 에 있는 것을 뽑아오면서 시간을 갱신해준다.. 이때도 마찬가지로 pq가 비어있으면 가장 빨리 요청될 예정인 시간으로 당겨주면 된다.. 인덱스를 이용해서 pq 2개를 번거롭게 이용하지 않아도 풀 수 있다