사용 알고리즘: 우선순위 큐
사용 언어: java
import java.util.*;
class Solution {
long lastTime = 0;
Queue<int[]> programs;
Queue<int[]> waitings;
long[] answer = new long[11];
public long[] solution(int[][] program) {
init(program);
int[] task = new int[3];
lastTime = task[1] + task[2];
while(!programs.isEmpty()) {
if(waitings.isEmpty() && lastTime < programs.peek()[1]) {
//&& lastTime < programs.peek()[1]
task = programs.poll();
lastTime = task[1] + task[2];
}
while(!programs.isEmpty()) {
//lastTime까지... 대기열에 들어가기
putWaitings();
int t = doWork(task);
if(t==1) break; //런타임에러-추가코드
}
}
while(!waitings.isEmpty()) {
doWork(task);
}
answer[0] = lastTime;
return answer;
}
public int doWork(int[] task) {
if(waitings.isEmpty()) return 1; //런타임에러-추가코드
task = waitings.poll();
answer[task[0]] += lastTime-task[1];
lastTime += task[2];
//기다림: task[1] - lastTIme;
return 0;
}
public void putWaitings() {
while(!programs.isEmpty()) {
if(lastTime < programs.peek()[1]) break;
waitings.add(programs.poll());
}
}
public void init(int[][] program) {
programs = new PriorityQueue<>((a,b) -> {
if(a[1]!=b[1]) return a[1]-b[1];
return a[0]-b[0];
});
waitings = new PriorityQueue<>((a,b) -> {
if(a[0]!=b[0]) return a[0]-b[0];
return a[1]-b[1];
});
for(int[] p : program) {
programs.add(p);
}
}
}
잘 짰는데 런타임 에러가 떴다..
왜지?했는데
while(!programs.isEmpty()) {
//lastTime까지... 대기열에 들어가기
putWaitings();
doWork(task);
}
여기서,,, programs도 비어있지 않고 + waitings가 비어있으면
doWork() 에서는 null인 queue에서 데이터를 빼야 하니까 runtime Error가 뜨는 것이었다!!
그래서
doWork()의 리턴 타입을 int이든 boolean이든 뭐든 만들고, waitings가 비어 있을 때 상태를 알려줄 필요가 있다
나는 int를 리턴 타입으로 하고, 1로 리턴되면 waitings가 비어 있다는 걸 알려준다.
그래서 while문을 돌다가 programs는 비어있지 않고 + waitings가 비어있게 되면,
while문을 빠져 나와서 다음 값을 넣고 다시 시작할 수 있도록 한다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
삼각 달팽이 (1) | 2024.12.12 |
---|---|
소수 찾기 (0) | 2024.12.11 |
[PCCP 모의고사 #1] 3번 - 유전법칙 (0) | 2024.12.09 |
모음사전 (0) | 2024.12.09 |
쿼드압축 후 개수 세기 (1) | 2024.12.09 |