프로그래머스

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

쿠쿠s 2022. 1. 17. 21:36

[문제]

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

 

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

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

programmers.co.kr


[문제 풀이]

이 문제는 '우선순위 큐' 로 해결 할 수 있는 문제입니다.

현재 작업이 종료되기 전에 들어온 요청들을 작업의 소요시간이 짧은 순서대로 나열해야하기 때문입니다.

근데 이 문제에서는 작업이 요청되는 시점과 작업의 소요시간으로 주어집니다.

문제에서는 [0,3] [1,9] [2,6] 으로 요청되는 시점 순으로 들어왔지만 실제 문제는 그 순서가 지켜진다고 적혀있지 않습니다. 그래서 우선 요청되는 시점 순으로 배열을 정렬을 한뒤 문제에 주어진 대로 코드를 완성해야 합니다.

 

  • 주어진 문제의 배열을 작업이 요청되는 시점이 짧은 순으로 정렬한다.
  • 우선순위큐는 작업의 소요시간이 짧은 순으로 정렬한다.
  • while문을 반복하는데 요청갯수를 0이라 설정하고 주어진 요청의 개수(배열의 길이)를 넘지 않게 반복한다.
  • 현재 작업이 끝나기 전에 들어온 요청 개수를 우선순위 큐에 모두 넣는다.
  • 큐에있는 작업을 진행시키면서 작업의 요청부터 종료까지 걸린 시간을 구하고 요청갯수를 증가시킨다.

 


[소스 코드]

 

import java.util.*;

class Solution {
	    public int solution(int[][] jobs) {
	        int answer = 0;
	        int end = 0; //작업 수행직후 시간
	        int index = 0;
	        int count =0; //요청 갯수
	        
	        
	        //작업의 요청 시점 정렬
	        Arrays.sort(jobs, new Comparator<int[]>() {	       	
				@Override
				public int compare(int[] o1, int[] o2) {
					return o1[0] - o2[0];
				}      	
			});
	        
	        PriorityQueue<int[]> q = new PriorityQueue<int[]>(new Comparator<int[]>() {

				@Override
				public int compare(int[] o1, int[] o2) {
					return o1[1] - o2[1];
				}
			});

	        while(count < jobs.length) {
	        	
	        	while(index < jobs.length && jobs[index][0] <= end) {
	        		q.add(jobs[index++]);
	        	}
	        	
	        	if(q.isEmpty()) {
	        		end = jobs[index][0];
	        	}else {
	        		int[] temp = q.poll();
	        		answer += temp[1] + end - temp[0];
	        		end += temp[1];
	        		count++;
	        	}
	        	
	        }
	        
	        return answer/jobs.length;
	    }
}