본문 바로가기
Coding Test/Programmers

[프로그래머스] 디스크 컨트롤러 [JAVA(자바)]

‘프로그래머스 코딩테스트 고득점 Kit’ 문제 입니다. 😀

문제 👉 <코딩테스트 연습 - 디스크 컨트롤러 | 프로그래머스>

1. 문제

작업의 요청부터 종료까지 걸린 시간이 가장 줄이는 방법으로 작업을 수행하여 각 작업의 요청부터 종료까지 걸린 시간의 평균을 return 한다.

2. 풀이

PriorityQueue 를 이용한 문제 풀이

  • 작업의 소요시간을 오름차순으로 유지하기 위해 PriorityQueue 로 나타낸다.
  • 작업의 요청시점을 오름차순으로 정렬 Arrays.sort(jobs, (o1, o2) -> o1[0] - o2[0]);
  1. 현재 시간 보다 작거나 같은 요청 시간 큐에 추가
  2. 큐에 작업이 없다면 작업 요청시점이 가장 빠른 작업 추가
  3. 큐에 작업이 있다면 작업 소요시간이 가장 빠른 작업 수행

3. 코드

import java.util.*;
class Solution {
    public int solution(int[][] jobs) {
        int answer = 0;
        int time = 0;
        int idx = 0;
        int len = jobs.length;

        // 작업의 소요시간 오름차순
        Queue<int[]> pq = new PriorityQueue<>((o1, o2) -> o1[1] - o2[1]);
        // 작업 요청시점 오름차순
        Arrays.sort(jobs, (o1, o2) -> o1[0] - o2[0]);

        while (!pq.isEmpty() || idx < len) {
            // 현재 시간 보다 작거나 같은 요청시점을 큐에 추가
            while (idx < len && jobs[idx][0] <= time) {
                pq.offer(jobs[idx++]);
            }
            // 큐에 작업이 없다면
            if (pq.isEmpty()) {
                // 작업 요청시점이 가장 빠른 작업 추가
                time = jobs[idx][0];
            }
            // 큐에 작업이 있다면
            else {
                // 작업 소요시간이 가장 빠른 작업 수행
                int[] job = pq.poll();
                time += job[1];
                answer += time - job[0];
            }            
        }

        return answer / len;
    }
}


References


🏋🏻 개인적으로 공부한 내용을 기록하고 있습니다.
잘못된 부분이 있다면 과감하게 지적해주세요!! 🏋

댓글