알고리즘/스택 큐

프로그래머스 - 기능개발(Java)

연향동큰손 2025. 1. 1. 20:19

 

배열과 큐를 이용해서 해결 하였다.

 

변수 설명

  1. head ==> 탐색을 시작할 위치(처음에는 head 변수 없이 이미 배포가 된 작업에 대해서도 체크를 해줘서 시간 초과가 발생하였다.)
  2. tail ==> progresses 배열의 크기
  3. 큐 ans ==> 배포된 갯수를 차례대로 삽입, poll() 함수를 이용하여 answer 배열에 복사
import java.util.*;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        int[] answer = {};
        Queue<Integer> ans = new LinkedList<>();
        int head=0;
        int tail=progresses.length;
        
        while(head<tail){
            for(int i=head; i<tail; i++){
                progresses[i]+=speeds[i];
            }
             int count = 0;
            while (head < tail && progresses[head] >= 100) { //head부터 개발이 끝난 작업이 있는지 체크
                count++;
                head++; // head 업데이트
            }
            if(count>0){
            ans.add(count); // 한번에 배포된 작업 개수를 큐에 삽입
            }
        }
        answer=new int[ans.size()];
        for(int i=0; i<answer.length; i++){
            answer[i]=ans.poll(); //answer배열에 결과를 넣어준다.
        }
        return answer;
    }
}

 

 

고민 했던 부분

 

answer=new int[ans.size()];
        for(int i=0; i<answer.length; i++){
            answer[i]=ans.poll();
        }

이 부분은 결과를 answer배열에 삽입해주는 부분이다.

 

 

처음에는 아래와 같이 i를 ans.size()까지로 제한 했더니 결과가 몇개 빠져서 출력되었다.

이 처럼 i<ans.size()로 반복문을 실행하면 poll()함수가 호출 될때마다 반복문 횟수가 줄어든다.

따라서 반복문의 횟수를 설정할때 answer.length로 해줘야 poll()함수 호출 횟수에 관련없이 answer배열에 정상적으로 삽입이된다.

answer=new int[ans.size()];
        for(int i=0; i<ans.size(); i++){
            answer[i]=ans.poll();
        }

 

 


2025-03-02 다시 풀었을때 풀이

import java.util.*;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        int head = 0;
        Queue<Integer> queue = new LinkedList<>();
        
        while(head<progresses.length){
        
            for(int i=head; i<progresses.length; i++){
                progresses[i] = progresses[i] + speeds[i];
            }
            
            if(progresses[head]>=100){ //배포 작업
                int count = 0;
                while(true){
                    count+=1;
                    head+=1;
                    if(head>progresses.length-1){ //head가 progresses배열을 넘어가는 경우
                        head=1000; //다음 while문이 실행되지 않도록 함
                        break; 
                    }
                    if(progresses[head]<100){ //더이상 배포할것이 없는 경우 
                        break; 
                    }
                }
                queue.add(count);
            }    
        }
        
        int[] answer = new int[queue.size()];
        int i=0;
        while(!queue.isEmpty()){
            answer[i] = queue.poll();
            i++;
        }
        return answer;
        
    }
}