코딩테스트/프로그래머스

[Java] 프로그래머스 - 디스크 컨트롤러 (3단계)

배똥회장 2022. 5. 17. 15:45
728x90
코딩 테스트 풀이 체크리스트
2시간 내에 풀었는가? X
본인의 실력으로 풀었는가?

 

 

코딩테스트 연습 - 디스크 컨트롤러

하드디스크는 한 번에 하나의 작업만 수행할 수 있습니다. 디스크 컨트롤러를 구현하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 요청이 들어온 순서대로 처리하는 것입니다. 예를

programmers.co.kr

 

 

 

 

 

import java.util.*;

class Solution {
    public int solution(int[][] jobs) {
        int answer = 0;
        
        //요청시간 순으로 정렬해놓은 큐
        PriorityQueue<Job> waiting = new PriorityQueue<>(new Comparator<Job>(){
            @Override
            public int compare(Job j1, Job j2) {
                return j1.start - j2.start;
            }
        });
        
        //작업시간 순으로 정렬할 큐
        PriorityQueue<Job> working = new PriorityQueue<>(new Comparator<Job>(){
            @Override
            public int compare(Job j1, Job j2) {
                return j1.work - j2.work;
            }
        });
        
        //waiting에 넣기
        for (int i = 0; i < jobs.length; i++) {
            waiting.offer(new Job(jobs[i][0], jobs[i][1]));
        }
        
        int count = 0; //몇 개 처리됬는지 파악할 변수
        int time = 0; //작업이 끝나는 시간을 담을 변수
        
        while (count < jobs.length) {
        	//waiting이 비어있지 않고, 작업이 끝나는 시간 이전에 요청이 들어온 것이 있다면
            //꺼내서 working에 넣기
        	while (!waiting.isEmpty() && time >= waiting.peek().start) {
                working.offer(waiting.poll());
            }
            
            //만약에 working이 비어있지 않으면
            if (!working.isEmpty()) {
            	//작업시간이 가장 짧은 즉, working 가장 처음에 있는 것을 꺼내서 계산하기
                //time은 작업이 끝나자마자 새로운 작업이 시작되기 때문에 해당 새로운 작업의 작업 시간 추가
                //answer은 총 시간이기 때문에 작업이 완전히 끝나는 시간부터 요청이 들어온 시간을 뺀 값을 추가하기
                //count는 작업 하나가 끝났기 때문에 1 더하기
                Job job = working.poll();
                time += job.work;
                answer += (time - job.start);
                count++;
            } else {
            //working이 비어있으면 time + 1
                time++;
            }
        }
        
        //총 시간에서 jobs의 갯수로 나눠서 리턴
        return answer / jobs.length;
    }
}

class Job {
    int start, work;
    public Job(int start, int work) {
        this.start = start;
        this.work = work;
    }
}

 

테스트 1 통과 (2.76ms, 73.2MB)
테스트 2 통과 (2.25ms, 75.8MB)
테스트 3 통과 (2.76ms, 70.8MB)
테스트 4 통과 (3.04ms, 76.6MB)
테스트 5 통과 (2.41ms, 74.2MB)
테스트 6 통과 (0.85ms, 65.4MB)
테스트 7 통과 (2.74ms, 73.5MB)
테스트 8 통과 (2.23ms, 73.9MB)
테스트 9 통과 (1.45ms, 73.8MB)
테스트 10 통과 (2.57ms, 77MB)
테스트 11 통과 (0.85ms, 78.7MB)
테스트 12 통과 (1.25ms, 77.6MB)
테스트 13 통과 (1.20ms, 74MB)
테스트 14 통과 (1.23ms, 75.6MB)
테스트 15 통과 (1.19ms, 75.7MB)
테스트 16 통과 (0.96ms, 76.5MB)
테스트 17 통과 (1.11ms, 77.6MB)
테스트 18 통과 (1.18ms, 76.1MB)
테스트 19 통과 (0.79ms, 75.1MB)
테스트 20 통과 (1.13ms, 80.7MB)

 

 

 

 

 

 

728x90