import java.util.*;
class Solution {
public String[] solution(String[][] plans) {
int endPoint = plans.length;
List<String> answer = new ArrayList<>();
Task[] tasks = new Task[endPoint];
for(int i=0; i<endPoint;i++){
Task task = new Task(plans[i]);
tasks[i]= task;
}
//오름차순정렬
//내림차순 정렬이 하고싶다면 b.start-a.start
//형식으로 해주면된다.
Arrays.sort(tasks, (a, b) -> {
return a.start - b.start;
});
Stack<Task> waitTask = new Stack<>();
int curTime = -1;
for(int i=0; i<endPoint;i++){
if(waitTask.isEmpty()){
waitTask.push(tasks[i]);
continue;
}
Task curT = waitTask.peek();
Task newT = tasks[i];
//매번 구해주면 시간이 걸리니 start와 tiem을 합쳐서 현재 작업 시간을 넣어준다.
curTime = curT.start+curT.time;
//현재 작업시간보다 다음 작업 시작시간이 길다면 끝났으니 answer에 넣어준다.
if(curTime <= newT.start){
answer.add(waitTask.pop().taskName);
} else{
//여기 때문에 좀 걸림
//전에것을 작업중 새로 들어온것이기 때문에
//작업 시작시간을 새로 들어온 시작 시간에서 빼서
//남은 작업시간에 빼줘야하는데
//그 시간을 그대로 넣어줘서 문제가 발생했음
curT.time -= newT.start - curT.start;
waitTask.push(newT);
continue;
}
//현재작업이 끝났으니 남아있는 시간을 활용하여
//남아있는 과제들을 처리한다.
waitTaskPop(waitTask, newT, curTime, answer);
//확인작업이 끝났는데 진행이 안되었으니
//stack에 넣어서 다음작업을 진행한다.
waitTask.push(tasks[i]);
}
//남아있는 과제를 진행하여 종료시키며
//answer에 넣어준다.
while(!waitTask.isEmpty()){
answer.add(waitTask.pop().taskName);
}
return answer.toArray(new String[0]);
}
public void waitTaskPop(Stack<Task> waitTask,Task newT, int curTime, List<String> answer){
while(!waitTask.isEmpty()){
//새로운 작업을 할 대기중내용을 배출한다.
Task work = waitTask.pop();
//현재 시간에서 다음 작업시작시간을 빼서 얼마나 다음작업을 할수있는지 시간을 구한다.
int point = newT.start- curTime;
//남은 작업시간보다 작업시간이 작다면
//answer에 넣어주고 현재시간에 작업시간을 더해준다.
if(work.time <= point){
answer.add(work.taskName);
curTime += work.time;
}
//더 적다면 진행 시간만큼 작업시간을 빼주고 다시
//stack에 넣어주고 반복문을 빠져나오게 하여 메서드를 종료시킨다.
else{
work.time -= point;
waitTask.push(work);
break;
}
}
}
static class Task{
private String taskName;
private int start;
private int time;
Task(String[] plan){
this.taskName = plan[0];
this.start = resultSecon(plan[1]);
this.time = Integer.parseInt(plan[2]);
}
public int resultSecon(String startTime){
String[] time = startTime.split(":");
int hour = Integer.parseInt(time[0])*60;
int minutes = Integer.parseInt(time[1]);
return hour+minutes;
}
}
}