프로그래머스 - [기능개발] 42586

2022. 3. 12. 16:17프로그래머스

문제 링크:
코딩테스트 연습 - 기능개발 | 프로그래머스 (programmers.co.kr)

 

코딩테스트 연습 - 기능개발

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는

programmers.co.kr

 

 

위 예시에서 각 진도에 따라 걸리는 시간은 정해져 있습니다.

100 - progresses 를 한 후에 speeds 로 나누면 되는 것이죠. 소수점이 나올경우 올림을 하면 됩니다.

 

걸리는 시간을 times 라고 한다면

times:   [7, 3, 9]

          [5, 10, 1, 1, 20, 1] 라고 할 수 있습니다.

 

위처럼 손쉽게 걸리는 시간을 구할 수 있습니다.

times 배열의 특징은 순차적으로 처리가 이뤄져야 한다는 것입니다. 

 

{ 7, 3, 9 } 의 경우 3 이 7보다 작으므로 같이 묶여서 처리된다는 의미이고

9의 경우에는 (7, 3)이 1주일 동안 처리되고 난 후 2일 후에(7+2=9) 처리가 완료된다는 의미입니다.

 

따라서 우리는 times 값들을 순차적으로 큐에 담은 후, 큐의 front 값보다 큰 값이 들어올 경우에만

queue에 담긴 값들을 묶어서 내보내면 됩니다.

 

 

정답 소스코드

public int[] solution(int[] progresses, int[] speeds) {
    List<Integer> list = new ArrayList<>();
    ArrayList<Integer> times = new ArrayList<>();
    Queue<Integer> que = new LinkedList<>();

    for(int i=0;i<progresses.length;i++){
        int workLeft = 100 - progresses[i];  // 남은 일
        double time = (double)workLeft / (double)speeds[i]; // 걸리는 시간
        time = Math.ceil(time);
        times.add((int)time); // 걸리는 시간
    }

    que.add(times.get(0));
    for(int i=1; i< times.size(); i++){
        int frontVal = que.peek();
        if(times.get(i) <= frontVal){
            que.add(times.get(i));
        }else{ // times.get(i) > frontval
            int count = 0;
            while(!que.isEmpty()){
                que.poll(); // 하나씩 빼준다.
                count++;
            }
            que.add(times.get(i));
            list.add(count);
        }
    }
    int count = 0;
    while(!que.isEmpty()){
        count++;
        que.poll();
    }
    list.add(count);
    int[] answer = new int[list.size()];
    for(int i=0;i<list.size();i++){
        answer[i] = list.get(i);
    }

    return answer;
}