티스토리 뷰
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개를 번거롭게 이용하지 않아도 풀 수 있다
'Problem Solving' 카테고리의 다른 글
[프로그래머스] 숫자 변환하기 (Java) (0) | 2023.08.22 |
---|---|
[BOJ 13702] 이상한 술집 (Java) (0) | 2022.06.13 |
[프로그래머스] 외벽 점검 (Java) (0) | 2022.05.11 |
[프로그래머스] 셔틀버스 (Java) (0) | 2022.05.07 |
[프로그래머스] 주차 요금 계산 (Java) (0) | 2022.05.06 |