문제풀이/코딩테스트

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

gyungmean 2024. 6. 26. 17:13

문제

https://school.programmers.co.kr/learn/courses/30/lessons/42627

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

코드

import java.util.*;
class Solution {
    public int solution(int[][] jobs) {
        Arrays.sort(jobs, Comparator.comparingInt(a -> a[0]));
        
        PriorityQueue<Job> pq = new PriorityQueue<>();
        
        int nowTime = 0;
        int totalTime = 0;
        int jobIndex = 0;
        int jobCount = 0;
        
        while(jobCount < jobs.length) {
            while(jobIndex < jobs.length && jobs[jobIndex][0] <= nowTime) {
                pq.add(new Job(jobs[jobIndex][0], jobs[jobIndex][1]));
                jobIndex++;
            }
            
            if(pq.isEmpty()) {
                nowTime = jobs[jobIndex][0];
            }
            else {
                Job nowJob = pq.poll();
                int waitTime = (nowTime - nowJob.insertTime) + nowJob.taskTime;
                nowTime += nowJob.taskTime;
                totalTime += waitTime;
                jobCount++;
            }
        }
        
        return totalTime / jobs.length;
    }
    class Job implements Comparable<Job> {
        int insertTime;
        int taskTime;
        public Job (int insertTime, int taskTime) {
            this.insertTime = insertTime;
            this.taskTime = taskTime;
        }
        @Override
        public int compareTo(Job o) {
            return Integer.compare(this.taskTime, o.taskTime);
        }
    }
}

 

접근방법

실행시간이 짧은 순으로 pq에 정렬하고 현재 시간보다 뒤에 요청들어온 job을 만나면 nowTime을 업데이트 해준다.

 

시행착오

jobs를 정렬하지 않아서 채점결과 한개빼고 모두 틀렸다.

뭔가 이해가 잘 가지 않아서 찾아보니 이 문제의 핵심은 현재시간에서 처리가 가능한 것 중 작업시간이 짧은 순으로 처리를 하는것이라고 한다.

jobs가 시간순으로 되어있다는 보장이 없는 점에 따라서 실행시간 순 정렬이 꼭 필요한거 같다.