본문 바로가기

Computer Science/알고리즘 문제풀이

Programmers > 스택/큐(Stack/Queue) > #30 기능개발

기능개발

 

문제: https://programmers.co.kr/learn/courses/30/lessons/42586

 

 

 

 

1. 문제 설명

 

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.

 

또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.

 

 

먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.

 

 

 

2. 나의 코드

 

- q: 완료되지 않은 모든 작업을 넣는 큐

- cq: 완료된 작업을 넣는 큐

- slist: 작업 스피드를 넣는 큐

- list: 해당 날짜에 완성된 작업의 개수를 넣는 ArrayList

- q와 slist를 각각 모든 작업과 작업속도를 넣는다.

- for문을 돌면서 모든 큐에 각요소에 해당하는 slist의 작업속도를 더한다.

- q.peek을 한 후 만약, top에 있는 작업이 100을 넘는다면, 100이 안넘는 작업이 나올때까지 cp에 100이 넘는 모든 작업을 넣는다.

- cp의 size를 list에 넣고 cp를 clear한다.

- list를 배열로 바꾼 후 리턴.  

 

 

 

import java.util.*;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        int[] answer = {};
        Queue <Integer> q = new LinkedList<>();
        Queue <Integer> cq = new LinkedList<>();
        Queue <Integer> slist = new LinkedList<>();
        ArrayList <Integer> list = new ArrayList<>();
        for(int i: progresses){
            q.offer(i);
        }
        for(int j: speeds){
            slist.offer(j);
        }
        while(!q.isEmpty()){
            int size = q.size();
            for(int i =0; i < size; i++){
                int temp = q.poll();
                int stemp = slist.poll();
                temp += stemp;
                q.offer(temp);
                slist.offer(stemp);
            }
            if(q.peek() >= 100){
                for(int j=0; j < size; j++){
                int temp2 = q.peek();
                if(temp2 >= 100){
                    cq.offer(q.poll());
                    slist.poll();
                }
                else
                    break;
                }
            list.add(cq.size());
            cq.clear();
            }
        }
        answer = new int[list.size()];
        for(int k=0;k <list.size();k++){
            answer[k] = list.get(k);
        }
        return answer;
    }
}

 

 

3. 다른사람 코드

 

- 각 작업당 필요한 날짜를 먼저 구해서 큐에 넣는다.

- 이후 for문을 돌면서, 위에 있는 남은 작업일수가 뒤에 있는 것 보다 크면, poll()을하고 count를 증가시킨다. 

 

for(int i=0; i<progresses.length; i++){
    int needDay = (100-progresses[i])/speeds[i];
    if((100-progresses[i])%speeds[i]!=0) needDay++;
    q.offer(needDay);
}

 

4. 보완


무작정 풀지말고, 좀만 생각해보면 기발한 아이디어가 나올것 같은데..