알고리즘/프로그래머스
** 디스크 컨트롤러 **
베리영young
2024. 2. 20. 10:34
import java.util.*;
class Solution {
public int solution(int[][] jobs) {
int answer = 0;
int count = 0; //몇 개나 수행함?
int idx = 0; //현재 인덱스 어디?
int end = 0; // 수행 직후 시간
//들어오는 요청 순으로 소팅
Arrays.sort(jobs, (o1, o2) -> o1[0] - o2[0]);
//수행 시간 짧은 순으로 소팅
PriorityQueue<int[]> pq = new PriorityQueue<>((o1, o2) -> o1[1] - o2[1]);
//요청 끝날 때까지 반복
while(count < jobs.length) {
// end(시간) 전에 들어온 요청은 쌓아두기
while(idx < jobs.length && jobs[idx][0] <= end) {
//어차피 얘네는 다 계산하고 나갈 거니까 idx는 사정 없이 증가시키기
pq.add(jobs[idx++]);
}
//큐가 비었다 + 아직 다 수행 못함
// => end를 지나서 들어온 요청이 있따?!?!
if(pq.isEmpty()) {
end = jobs[idx][0];
}
//큐가 비지 않았다! => 계산해라 노예야
//우선순위큐 썼으니까 순서는 알아서 일 적은 애부터 들어감
else{
int[] tmp = pq.poll();
//계산하렴 (들어왔을 때부터로 계산해야 하니까 -tmp[0] 잊지 말기)
answer += tmp[1] + end - tmp[0];
// 수행 끝나고 -> end 갱신
end += tmp[1];
// 수행 완료한 작업 +1
count++;
}
}
return (int) Math.floor(answer / jobs.length);
}
}
어케 푸는데..ㅠ
1. 다 인덴스 소팅하는 방법... 람다식 외우기
차이:
나는 우선순위 큐에 1. 일의 양 오름차순 2. 일이 들어오는 순서 오름차순
이렇게 생가했었다ㅠ