Java

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

openDeveloper 2023. 3. 19. 14:12

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

 

프로그래머스

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

programmers.co.kr

풀이 접근법 : 2번의 PriorityQueue를 만든 다음, 하나의 PriorityQueue pqStart에는 시작 시간 순, 하나의 PriorityQueue pqJob은 작업 시간 순으로 오름차순으로 정렬해 time을 증가시키면서 이전 작업 시간을 초과한 작업들을 하나씩 pqJob에서 뽑아 작업해 계산.

 

나의 코드

import java.util.*;

class Solution {
    public int solution(int[][] jobs) {
        int jobNum = jobs.length;
        int time = 0;
        int jobAllTime = 0;

        PriorityQueue<Job> pq = new PriorityQueue<>(new Comparator<Job>() {
            @Override
            public int compare(Job o1, Job o2) {
                return o1.startTime - o2.startTime;
            }
        });
        PriorityQueue<Job> pq1 = new PriorityQueue<>(new Comparator<Job>() {
            @Override
            public int compare(Job o1, Job o2) {
                return o1.jobTime - o2.jobTime;
            }
        });        
        for (int[] job : jobs) {
            pq.offer(new Job(job[0],job[1]));
        }
        while(!pq.isEmpty()){
            Job cur ;
            while(!pq.isEmpty() && pq.peek().startTime <= time){
                cur = pq.poll();
                pq1.offer(new Job(cur.startTime, cur.jobTime));
            }
            if(!pq1.isEmpty()){
                cur = pq1.poll();
                time += cur.jobTime;
                jobAllTime += time - cur.startTime;
            }else{
                time = time+1;
            }            
            while(!pq1.isEmpty()){
                cur = pq1.poll(); 
                pq.offer(new Job(cur.startTime, cur.jobTime));
            }
        }

        return jobAllTime / jobNum;
    }    
    class Job {
        int startTime;
        int jobTime;

        Job(int startTime, int jobTime){
            this.startTime = startTime;
            this.jobTime = jobTime;
        }
 }

}

 

chatgpt 돌려 가독성 좋은 코드

import java.util.*;

class Solution {
    public int solution(int[][] jobs) {
        PriorityQueue<Job> pq = new PriorityQueue<>(Comparator.comparingInt(j -> j.start));
        PriorityQueue<Job> pq1 = new PriorityQueue<>(Comparator.comparingInt(j -> j.time));
        for (int[] job : jobs) {
            pq.offer(new Job(job[0], job[1]));
        }
        int currentTime = 0;
        int totalTime = 0;
        while (!pq.isEmpty() || !pq1.isEmpty()) {
            while (!pq.isEmpty() && pq.peek().start <= currentTime) {
                pq1.offer(pq.poll());
            }
            if (!pq1.isEmpty()) {
                Job cur = pq1.poll();
                currentTime += cur.time;
                totalTime += currentTime - cur.start;
            } else {
                currentTime++;
            }
        }
        return totalTime / jobs.length;
    }

    static class Job {
        int start, time;

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

'Java' 카테고리의 다른 글

[Java] 03/20 알고리즘 문제  (0) 2023.03.21
백준 24174번 : 알고리즘 수업 - 힙 정렬 2  (0) 2023.03.19
프로그래머스: 프린터  (0) 2023.03.18
백준 1158번: 요세푸스 문제  (0) 2023.03.18
백준 26008번: 해시 해킹 문제  (1) 2023.03.16