프로그래머스 연습문제 과제 진행하기 [JAVA] - 23년 4월 21일

Denia·2023년 4월 20일
0

코딩테스트 준비

목록 보기
181/201

구현 문제인것 같다.

구현도 어려웠는데 조건이 생각보다 까다로워서 코드를 몇번이나 뒤엎고 다시 풀었다. 시간이 상당히 오래 걸렸다. ㅠㅠ

//과제 진행하기

//23년 4월 21일 오전 12시 30분 시작 -> 오전 2시 13분 끝

import java.util.*;

class Solution {
    public String[] solution(String[][] plans) {
        List<Plan> answers = new ArrayList<>();

        PriorityQueue<Plan> planList = new PriorityQueue<>(Comparator.comparingInt(p -> p.startMinute));
        for (String[] plan : plans) {
            planList.add(new Plan(plan[0], plan[1], plan[2]));
        }

        Deque<Plan> waitQueue = new ArrayDeque<>();

        while (!planList.isEmpty()) {
            Plan curPlan = planList.poll();

            //curPlan 이 마지막 계획
            if (planList.isEmpty()) {
                answers.add(curPlan);
                break;
            }

            Plan nextPlan = planList.peek();

            //다음 계획이 먼저 실행 -> 현재 계획은 wait으로
            if (curPlan.endMinute > nextPlan.startMinute) {
                curPlan.startMinute = nextPlan.startMinute;
                waitQueue.addLast(curPlan);
            }
            //다음 계획이 딱 맞게 실행
            else if (curPlan.endMinute == nextPlan.startMinute) {
                answers.add(curPlan);
            }
            //현재 계획이 먼저 끝남
            else {
                answers.add(curPlan);
                //현재 시간
                int curTime = curPlan.endMinute;

                //대기 Queue를 돌면서 대기 Plan을 확인
                while (!waitQueue.isEmpty()) {
                    //대기 Plan
                    Plan waitPlan = waitQueue.pollLast();

                    //대기 Plan의 남아있는 시간 확인
                    int remainMinute = waitPlan.endMinute - waitPlan.startMinute;

                    //다음 계획이 대기 Plan 보다 먼저 실행
                    if (curTime + remainMinute > nextPlan.startMinute) {
                        waitPlan.startMinute += nextPlan.startMinute - curTime;
                        waitQueue.addLast(waitPlan);
                        break;
                    }
                    //다음 계획이 대기 Plan 과 딱 맞게 실행
                    else if (curTime + remainMinute == nextPlan.startMinute) {
                        answers.add(waitPlan);
                        break;
                    }
                    //대기 Plan이 먼저 끝남
                    else {
                        answers.add(waitPlan);
                        curTime = curTime + remainMinute;
                    }
                }
            }
        }
		
        //남아 있는 waitQueue 을 모두 처리
        while (!waitQueue.isEmpty()) {
            Plan waitPlan = waitQueue.pollLast();
            answers.add(waitPlan);
        }

        return answers.stream().map(p -> p.subject).toArray(String[]::new);
    }

    static class Plan {
        String subject;
        int startMinute;
        int endMinute;

        public Plan(String subject, String startTime, String remainMinute) {
            this.subject = subject;
            this.startMinute = convertTime(startTime);
            this.endMinute = this.startMinute + Integer.parseInt(remainMinute);
        }

        private int convertTime(String startTime) {
            String[] time = startTime.split(":");
            int hour = Integer.parseInt(time[0]);
            int minute = Integer.parseInt(time[1]);
            return hour * 60 + minute;
        }
    }
}

profile
HW -> FW -> Web

0개의 댓글