본문 바로가기

프로그래머스 - JAVA

코딩테스트 연습 > 힙(Heap) > 디스크 컨트롤러

기존 코드

import java.util.*;

class Solution {
    public int solution(int[][] jobs) {
        
        PriorityQueue<DiskTask> jobAllQueue = new PriorityQueue<>(new Comparator<DiskTask>() {
            @Override
            public int compare(DiskTask o1, DiskTask o2) {
                if(o1.getStartTime() == o2.getStartTime() ) {
                    return o1.getLeadTime() - o2.getLeadTime();
                } else {
                    return o1.getStartTime() - o2.getStartTime();
                }
            }
        });
        
        PriorityQueue<DiskTask> jobTimeQueue = new PriorityQueue<>(new Comparator<DiskTask>() {
            @Override
            public int compare(DiskTask o1, DiskTask o2) {
                if(o1.getLeadTime() == o2.getLeadTime() ) {
                    return o1.getStartTime() - o2.getStartTime();
                } else {
                    return o1.getLeadTime() - o2.getLeadTime();
                }
            }
        });
        
        
        for (int [] job : jobs){
            jobAllQueue.add(new DiskTask(job[0], job[1]));
        }
        
        DiskTask currentTask;
        int answer = 0;
        int endTime = 0;
        int taskSuccessCount = 0;
        
        while(true){
            if(jobAllQueue.isEmpty()){
                break;
            } else {
                while(!jobAllQueue.isEmpty()){
                    if(endTime >= jobAllQueue.peek().getStartTime()){
                        jobTimeQueue.add(jobAllQueue.poll());
                    } else{
                        break;
                    }
                }
                if(!jobTimeQueue.isEmpty()){
                    currentTask = jobTimeQueue.poll();
                    jobAllQueue.addAll(jobTimeQueue);
                    jobTimeQueue.clear();
                    answer += (endTime - currentTask.getStartTime() + currentTask.getLeadTime());
                    endTime += currentTask.getLeadTime();
                } else {
                    currentTask = jobAllQueue.poll();
                    answer += currentTask.getLeadTime();
                    endTime += currentTask.getStartTime() - endTime + currentTask.getLeadTime();
                }
                
            }
        }
        return answer/jobs.length;
    }
    
    class DiskTask {
        int startTime;
        int leadTime;
        
        public DiskTask(int startTime, int leadTime){
            this.startTime = startTime;
            this.leadTime = leadTime;
        }
        public int getStartTime(){
            return this.startTime;
        }
        public int getLeadTime(){
            return this.leadTime;
        }
        // @Override
        // public int compareTo(DiskTask diskTask) {
        //     if(this.getStartTime() - diskTask.getStartTime() == 0){
        //         return this.getLeadTime() - diskTask.getLeadTime();
        //     } else{
        //         return this.getStartTime() - diskTask.getStartTime();
        //     }
        // }
    }
}

최근 코드

import java.util.*;

class Solution {
    public int solution(int[][] jobs) {
        PriorityQueue <DiskTask> jobsPq = new PriorityQueue<>(
            new Comparator<DiskTask>(){
                @Override
                public int compare(DiskTask d1, DiskTask d2){
                    return d1.getStartTime() - d2.getStartTime();
                }
        });
        
        PriorityQueue <DiskTask> comparePq = new PriorityQueue<>(
            new Comparator<DiskTask>(){
                @Override
                public int compare(DiskTask d1, DiskTask d2){
                    return d1.getLeadTime() - d2.getLeadTime();
                }
        });
        
        for (int[] job : jobs){
            jobsPq.add(new DiskTask(job[0], job[1]));
        }
        
        int answer = 0;
        int currentTime = 0;
        DiskTask currentDiskTask;
        
        while(true){
            while (!jobsPq.isEmpty()){
                if (currentTime >= jobsPq.peek().getStartTime()){
                    comparePq.add(jobsPq.poll());
                } else {
                    break;
                }
            }
            if (comparePq.size() > 0){
                currentDiskTask = comparePq.poll();
                int size = comparePq.size();
                for (int i = 0 ; i < size ; i++){
                    jobsPq.add(comparePq.poll());
                }
                answer += (currentTime - currentDiskTask.getStartTime() + currentDiskTask.getLeadTime());
                currentTime += currentDiskTask.getLeadTime();
            } else {
                currentTime ++;
            }
            if (jobsPq.isEmpty()){
                break;
            }
        }
        
        return answer / jobs.length;
    }
}


class DiskTask {
    int startTime;
    int leadTime;
    
    public DiskTask(int startTime, int leadTime){
        this.startTime = startTime;
        this.leadTime = leadTime;
    }
    public int getStartTime(){
        return startTime;
    }
    public int getLeadTime(){
        return leadTime;
    }
}