programmers_과제 진행하기_java

2023. 5. 26. 17:39Algorithm/Programmers

728x90

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

 

프로그래머스

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

programmers.co.kr

import java.util.*;

class Solution {    
    public static String[] solution(String[][] plans) {
        String[] answer = new String[plans.length];

        PriorityQueue<Plan> readyQueue = new PriorityQueue<>(); // 남은 과제 우선순위 큐
        Stack<Plan> pauseQueue = new Stack<>(); // 중지 과제 스택

        for (String[] plan : plans){ // 우선순위 큐 입력
            readyQueue.offer(new Plan(plan));
        }

        int idx = 0; // answer 인덱스
        
        // 과제 실행
        Plan now = readyQueue.poll();
        while (true){
            Plan next = null;
            if (!readyQueue.isEmpty()){ // 새로운 과제가 존재하는 경우 
                next = readyQueue.peek();
            }else { // 새로운 과제가 더이상 없는 경우
                answer[idx++] = now.name;
                break;
            }

            if (now.start + now.playtime > next.start){ // 새로운 과제 시작
                pauseQueue.push(new Plan(now.name, next.start, now.playtime - (next.start - now.start))); // 실행중 과제 스택에 추가
                now = readyQueue.poll();
            }
            else { // 현재 과제 종료
                answer[idx++] = now.name;
                if (!pauseQueue.isEmpty()){
                    int t = now.start + now.playtime;
                    now = pauseQueue.pop();
                    now.start = t; // 시작 시간 초기화
                }else {
                    now = readyQueue.poll();
                }
            }
        }

        // 중지 목록 모두 실행
        while (!pauseQueue.isEmpty()){
            now = pauseQueue.pop();
            answer[idx++] = now.name;
        }

        return answer;
    }



    public static int timeToMin(String time){
        int res = 0;
        String[] t = time.split(":");
        res += Integer.parseInt(t[1]) + Integer.parseInt(t[0]) * 60;
        return res;
    }

    public static class Plan implements Comparable<Plan>{
        String name;
        int start;
        int playtime;
        public Plan(String[] plan){
            this.name = plan[0];
            this.start = timeToMin(plan[1]);
            this.playtime = Integer.parseInt(plan[2]);
        }

        public Plan(String name, int start, int playtime){
            this.name = name;
            this.start = start;
            this.playtime = playtime;
        }

        @Override
        public int compareTo(Plan o) {
            return this.start - o.start;
        }

        @Override
        public String
        toString() {
            return "Plan{" +
                    "name='" + name + '\'' +
                    ", start=" + start +
                    ", playtime=" + playtime +
                    '}';
        }
    }
}