디스크 컨트롤러


프로그래머스 [디스크 컨트롤러]

문제보기
Alt text

소스코드

  • 하드디스크가 쉬고있을때, 요청이 들어오지 않는 시간에도 대기큐에 요청이 있다면 처리해야함을 주의
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);
    }
}