본문 바로가기
공부 정리/프로그래머스

[프로그래머스] 자바 기능개발

by 경적필패. 2021. 12. 3.
반응형

문제

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

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

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

제약사항

  • 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
  • 작업 진도는 100 미만의 자연수입니다.
  • 작업 속도는 100 이하의 자연수입니다.
  • 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.

접근

각 작업들이 주어지고 각 작업들의 속도가 주어집니다.

각 작업들은 100이 되는순간 종료됩니다.

각 작업들이 며칠에 걸쳐서 완성되는지 뽑아내는게 이 문제의 핵심인듯 합니다.


예를들어

작업 진행도[93, 30, 55]

작업 속도[1, 30, 5]

일 때,

각 작업은, 7일 3일 9일후 작업이 완료됩니다.

이를 큐에 넣어서 7, 3, 9에서 순서대로 값을 빼면서 더 큰 값이 나올때 마다 결과값에 하나씩 해당 값을 넣습니다.

7,3,9를 예로들면,

7을 먼저 빼고, 3과 비교합니다.

7이 3보다 크므로 3도 빼고 9와 비교합니다.

9는 7보다 크므로 비교를 종료하고 2(7,3)를 결과 값에 넣습니다.

현재 큐에는 7만 남았으므로 빼면, 결과는 2,1이 나옵니다.


코드

import java.util.*;
class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        ArrayList<Integer> list = new ArrayList<>();
        Deque<Integer> dq = new LinkedList<>();
        
        //작업완료 걸리는 시간 계서해서 큐에 넣기
        for(int i=0; i<progresses.length; i++){
            int progress = progresses[i];
            int speed = speeds[i];
            int workTime[] = new int[progresses.length];
            int time = 0;
            while(true){
                if(progress >= 100) break;
                progress += speed;
                time++;
            }
            workTime[i] = time;
            dq.add(time);
        }
        //큐의 시간순서대로 계산하여 다음값보다 작을때까지 sum 계산해서 리스트에 넣기
        int temp = 0;
       while(!dq.isEmpty()){
           int sum = 1;
           temp = dq.poll();
           int size = dq.size();
           for(int i=0; i<size; i++){
               if(temp < dq.peek()) break;
               else{
                   dq.poll();
                   sum++;
               }
           }
           list.add(sum);
       }
        
        //리스트를 정답 answer에 옮기기
        int answer[] = new int[list.size()];
        for(int i=0; i<list.size(); i++){
            answer[i] = list.get(i);
        }
        return answer;
    }
}

주의

덱을 사용하나, 큐를 사용하나, 스택을 사용하나 상관 없을듯 합니다.

 

반응형

댓글