기능개발(Queue)

Seungmin Lim·2022년 2월 13일
0

코딩문제연습

목록 보기
46/63

문제

기능개발

나의코드

import java.util.*;
class Solution{
public int[] solution(int[] progresses, int[] speeds) {
        ArrayList<Integer> a = new ArrayList<>();
        Queue<Program> Q = new LinkedList<>();
        for(int i=0; i<progresses.length;i++) {
            Q.offer(new Program(i,progresses[i]));
        }   
        while(!Q.isEmpty()) {
            int cnt = 0;
            //맨 앞 진도율이 100 미만이면
            while(Q.peek().progress < 100) {
                for(Program x : Q) {
                    x.progress += speeds[x.order];
                }
            }
            //맨 앞 진도율이 100이상 되면, 맨앞이 100이 안넘을때까지 poll, cnt++
            while(!Q.isEmpty() && Q.peek().progress >= 100) {
                Q.poll();
                cnt++;
            }
            a.add(cnt);
        }
        int[] answer = new int[a.size()];
        for(int i=0; i<a.size();i++) {
            answer[i] = a.get(i);
        }
        return answer;
}
}
class Program{
    int order;
    int progress;
    public Program(int order, int progress) {
        this.order = order;
        this.progress = progress;
    }
}

풀이방법

전부 Queue에 넣은후, 맨 앞의 작업의 진도가 100이 될때까지 모든 작업에 speed를 추가해줬다.
맨앞의 진도가 100이 되는순간, q에서 poll시키고 cnt가 1증가한다.
그 뒤에 작업부터는 peek이 100을넘는다면 poll시키고 cnt를 1증가시킨다.

만약 100을 넘지 못한다면,
while문이 끝나고 cnt = 0 이되고
다시 맨앞의 요소를 100까지 만들기위해 모든 작업에 speed를 증가시킨다.

핵심키워드

이 문제를 푸는데 거의 2시간정도 걸린거같다...
계속 nullPointerException과 concurrentmodificationexception때문에 고생했는데,
Queue를 poll하고 peek를 비교할때 더 신중하게 해야겠다.

0개의 댓글