구현
https://school.programmers.co.kr/learn/courses/30/lessons/176962
import java.util.*;
class Solution {
public String[] solution(String[][] plans) {
PriorityQueue<Subject> pQ = input(plans);
List<String> ansList = proceedSubject(pQ);
return ansList.stream().toArray(String[]::new);
}
public PriorityQueue input(String[][] plans) {
PriorityQueue<Subject> pQ = new PriorityQueue<>();
for(String[] plan : plans) {
String name = plan[0];
String startTime = plan[1];
int remainedMinute = Integer.parseInt(plan[2]);
String[] split = startTime.split(":");
int hour = Integer.parseInt(split[0]) * 60;
int minute = Integer.parseInt(split[1]);
pQ.offer(new Subject(name, hour + minute, remainedMinute));
}
return pQ;
}
public List proceedSubject(PriorityQueue<Subject> pQ) {
List<String> ansList = new ArrayList<>();
Stack<Subject> readyStack = new Stack<>();
readyStack.push(pQ.poll());
while(!pQ.isEmpty()) {
Subject next = pQ.poll();
int curTime = readyStack.peek().startTimeByMinute;
while(!readyStack.isEmpty()) {
Subject cur = readyStack.pop();
int interval = next.startTimeByMinute - curTime;
// 현재 과제를 끝내고 다음 과제까지 시간이 남는 경우
if(cur.remainedMinute < interval) {
ansList.add(cur.name);
curTime += cur.remainedMinute;
}
// 현재 과제를 끝내고 다음 과제를 바로 시작하는 경우
else if(cur.remainedMinute == interval) {
ansList.add(cur.name);
break;
}
// 현재 과제를 끝내지 못하고 다음 과제를 시작해야 하는 경우
else {
cur.remainedMinute -= interval;
System.out.println(cur.name);
readyStack.push(cur);
break;
}
}
readyStack.push(next);
}
while(!readyStack.isEmpty()) {
ansList.add(readyStack.pop().name);
}
return ansList;
}
public static class Subject implements Comparable<Subject> {
String name;
int startTimeByMinute;
int remainedMinute;
public Subject(String name, int startTimeByMinute, int remainedMinute) {
this.name = name;
this.startTimeByMinute = startTimeByMinute;
this.remainedMinute = remainedMinute;
}
@Override
public int compareTo(Subject s) {
return this.startTimeByMinute - s.startTimeByMinute;
}
}
}
현재 과제를 끝내고 다음 과제까지 시간이 남는 경우
→ 대기 스택에 위치한 과제 수행
현재 과제를 끝내고 다음 과제를 바로 시작하는 경우
현재 과제를 끝내지 못하고 다음 과제를 시작해야 하는 경우
→ 현재 과제의 남은 시간을 갱신하고 다시 대기 스택에 삽입
1시간
간단한 문제처럼 보여서 흐름에 따라 바로 구현 들어갔다가 코드 퀄리티가 많이 떨어짐을 느껴 뒤늦게 리팩토링을 진행했습니다. 생각보다 시간이 오래 걸렸네요. 😅