프로그래머스 [디스크 컨트롤러]
문제보기

소스코드
- 하드디스크가 쉬고있을때, 요청이 들어오지 않는 시간에도 대기큐에 요청이 있다면 처리해야함을 주의
import java.util.*;
class Solution {
public static int solution(int[][] jobs) {
Arrays.sort(jobs, (Comparator.comparingInt((int[] job) -> job[0]).thenComparingInt(job -> job[1])));
// 작업 수행
Queue<Job> waitQueue = new PriorityQueue<>();
int totalTime = 0;
int jobIndex = 0;
int currentTime = jobs[jobIndex][0];
waitQueue.add(new Job(jobIndex, jobs[jobIndex][0], jobs[jobIndex][1]));
while (!waitQueue.isEmpty()) {
Job executeJob = waitQueue.poll();
if (currentTime < executeJob.requestTime) currentTime = executeJob.requestTime;
totalTime += (currentTime + executeJob.takenTime) - executeJob.requestTime;
currentTime += executeJob.takenTime;
for (int i = jobIndex + 1; i < jobs.length; i++) {
Job job = new Job(i, jobs[i][0], jobs[i][1]);
if (job.requestTime <= currentTime || waitQueue.isEmpty()) {
waitQueue.add(job);
jobIndex++;
} else {
break;
}
}
}
return totalTime / jobs.length;
}
}
class Job implements Comparable<Job> {
int jobNo;
int requestTime;
int takenTime;
public Job(int jobNo, int requestTime, int takenTime) {
this.jobNo = jobNo;
this.requestTime = requestTime;
this.takenTime = takenTime;
}
@Override
public int compareTo(Job compareObj) {
// 우선순위 : 작업의 소요시간이 짧은 것 > 작업의 요청 시각이 빠른 것 > 작업의 번호가 작은 것
int compareTakenTime = Integer.compare(this.takenTime, compareObj.takenTime);
if (compareTakenTime != 0) return compareTakenTime;
int compareRequestTime = Integer.compare(this.requestTime, compareObj.requestTime);
if (compareRequestTime != 0) return compareRequestTime;
return Integer.compare(this.jobNo, compareObj.jobNo);
}
}