알고리즘/프로그래머스

[PCCP 모의고사 #1] 4번 - 운영체제

베리영young 2024. 12. 9. 14:35

사용 알고리즘: 우선순위 큐

사용 언어: 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