

import java.util.*;
class Solution {
public long[] solution(int[][] program) {
long[] answer = new long[11];
Queue<int[]> wait=new PriorityQueue<>((a,b)->a[1]-b[1]);
Queue<int[]> arrive=new PriorityQueue<>((a,b)->{
if(a[0]==b[0]) return a[1]-b[1];
else return a[0]-b[0];
});
long time=0;
for(int[] p:program)
wait.add(p);
while(!wait.isEmpty()||!arrive.isEmpty()){
if(!wait.isEmpty()&&time>=wait.peek()[1]){
while(!wait.isEmpty()&&time>=wait.peek()[1]){
arrive.add(wait.poll());
}
}
if(!arrive.isEmpty()){
answer[arrive.peek()[0]]+=time-arrive.peek()[1];
time+=arrive.poll()[2];
}
else if(!wait.isEmpty()) time=wait.peek()[1];
}
answer[0]=time;
return answer;
}
}
(1) 우선순위 큐 두개를 만든다.
(2) wait 큐에 모든 작업들을 넣어주고, 반복문을 시작한다.
(3) answer[0] 에는 전체 진행시간이 들어가므로 time을 넣어주고 answer을 반환한다.

분명 어려운 문제라고 생각하진 않았는데, 계속 채점에서 실패했다.
도저히 뭐가 잘못된 건지 찾을수가 없어서 3~4시간 정도 걸렸다.
내가 처음에 했던 방식은
현재 시간 기준으로 호출된 모든 작업을 arrive에 넣어주는데,
만약 호출된 작업이 없다면, 다음 가장 빠른 작업의 호출시간으로 시간을 바꿔버리고 continue를 해버렸다.
이렇게 하면 arrive에 작업이 있는데, 시간을 바꿔버리기 때문에 문제가 발생한다.
요즘 너무 감이 떨어진 것 같다.
분명 간단하게 해결할 수 있는 문제였는데도 푸는데 어려움이 있었다.
정말 잘하고 싶은데, 알고리즘은 실력을 올리기가 너무 어려운 것 같다.
출처 : 프로그래머스 코딩 테스트 연습 https://school.programmers.co.kr/learn/challenges