참고
문제해설
문제 로직고민
NOTE
•
처음 문제를 읽고 선점방식의 스케쥴링인줄 알고 상당히 애먹었다..
◦
진행중인 job은 교체되지 않으며, 완전히 끝날때까지 다른 작업을 하지 않는다.
•
모든 작업의 마무리되는 평균 처리 시간을 줄인다 ⇒ 처리량이 빠른것부터 처리한다.
◦
처리가 늦은 작업을 앞에두면, 빠른 처리량을 가진 작업도 그 시간만큼 느려지게됨
작성코드
NOTE
import java.util.*;
class Solution {
public int solution(int[][] jobs) {
Arrays.sort(jobs, (a,b) -> a[0] - b[0]);
PriorityQueue<int[]> pq = new PriorityQueue<>((o1, o2) -> o1[1] - o2[1]);
int answer = 0;
int index = 0; // jobs 배열의 idx
int count = 0; // 수행된 요청 개수
int time = 0; // 수행되고난 직후의 시간
// 모두 처리할때까지
while(count < jobs.length){
// 하나의 작업이 완료되는 시점(time) 까지 들어온 모든 요청을 큐에 넣음
while(index < jobs.length && jobs[index][0] <= time) pq.add(jobs[index++]);
// pq가 비어있다 => 넣을 작업이없으므로 다음 작업의 시작시간까지 이동
if(pq.isEmpty()) time = jobs[index][0];
// pq가 존재한다 => 넣을 작업이 있으므로 처리해줌
else{
int[] cur = pq.poll();
answer += cur[1] + time - cur[0];
time += cur[1];
count++;
}
}
return answer / jobs.length;
}
}
Java
복사
다른사람 풀이
NOTE
import java.util.Arrays;
import java.util.PriorityQueue;
class Solution {
public int solution(int[][] jobs) {
int answer = 0;
// 작업이 요청되는 시점 기준으로 오름차순 정렬
Arrays.sort(jobs, (o1, o2) -> o1[0] - o2[0]);
// 작업의 소요시간 기준으로 오름차순 정렬
PriorityQueue<int[]> pq = new PriorityQueue<>((o1, o2) -> o1[1] - o2[1]);
int jobs_index = 0; // 작업 배열 인덱스
int finish_job = 0; // 처리 완료된 작업 개수
int end_time = 0; // 작업 처리 완료 시간
while(true) {
if(finish_job == jobs.length) break; // 모든 작업을 처리했다면 종료
// 이전 작업 처리 중 요청된 작업 add
while(jobs_index < jobs.length && jobs[jobs_index][0] <= end_time) {
pq.add(jobs[jobs_index++]);
}
if(!pq.isEmpty()) { // 이전 작업 처리 중 요청된 작업이 있는 경우
int[] job = pq.poll();
answer += end_time - job[0] + job[1]; // 작업 요청부터 종료까지 걸린 시간 추가
end_time += job[1]; // 작업 처리 완료 시간 갱신
finish_job++; // 처리 완료된 작업 개수 1 증가
} else { // 이전 작업 처리 중 요청된 작업이 없는 경우
end_time = jobs[jobs_index][0]; // 다음 작업 요청 시점으로 갱신
}
}
return answer / jobs.length;
}
}
Java
복사
비슷한 방법
•
결국 풀이 방식은 우선순위 큐를 사용하는것이 중요.