<프로그래머스> 기능개발

문제 링크

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

문제 분석

  • progresses 배열과 speeds 배열이 주어진다.
  • progresses 배열은 먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열이며, speeds배열은 해당 작업들의 개발 속도가 적힌 정수배열이다.
  • 일단 progresses배열은 남은 작업량을 나타내는 정수배열로 새롭게 할당한다.
  • 이후, progresses의 값들을 speeds의 값들로 나눈다.
  • 위의 경우 나누어떨어지는 경우와 그렇지 못한 경우로 나누어서 전자의 경우 몫을 큐에 추가하고, 후자의 경우 (해당 몫+1)을 큐에 추가한다.
  • 이후, 큐의 젤 앞의 원소(x)를 poll()해서 새로운 리스트에 할당하고 peek()를 두 번째 원소(y)와 크기를 비교한다.
  • 만약 x >= y이면, y를 poll()해서 리스트에 추가한다.
  • 만약 x < y이면, 해당 리스트의 사이즈를 answerList에 할당하고, 리스트 초기화한다.

문제 예시

  • progresses 배열 : 93, 30, 55
  • speeds 배열 : 1, 30, 5
  • 첫번째 기능은 93퍼센트 완료된 상태이고, 하루에 1퍼센트씩 진행 가능하니까 총 7일 후에 배포가 가능하다.
  • 두번째 기능은 3일간의 작업만해도 배포는 가능하지만, 첫번째 기능이 완료되지 않으므로 7일째에 배포 가능하다. 세번째 기능은 하루에 5퍼센트씩 진행 가능하니까 9일간의 작업후에 배포가 가능하다.따라서 7일째에 2개의 기능, 9일째에 1개의 기능을 배포 할 수있다. 그러므로 리턴값은 (2,1) 배열이 되어야한다.

구현 코드

import java.util.*;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        int[] answer = {};

        Queue<Integer> required_time_queue = new LinkedList<>();
        LinkedList<Integer> list = new LinkedList<>(); 
        LinkedList<Integer> answer_list = new LinkedList<>(); 

        //남은 작업량 나타내는 배열로 바꾸기
        //남은 작업량 / 스피드 -> 필요한 작업일을 가지는 배열
        for(int i = 0; i < progresses.length ; i++){
            progresses[i] = 100 - progresses[i];
            if(progresses[i] % speeds[i] == 0){
                required_time_queue.add((int)(progresses[i] / speeds[i]));
            }
            else{
                required_time_queue.add((int)(progresses[i] / speeds[i] + 1));
            }
        }
        //제일 앞의 작업을 리스트에 추가
        list.add(required_time_queue.poll());
        while(required_time_queue.size() != 0){
            if(required_time_queue.peek() <= list.get(0)){
                list.add(required_time_queue.poll());
            }
            else{
                answer_list.add(list.size());
                list.clear();
                list.add(required_time_queue.poll());
            }
        }
        answer_list.add(list.size());
        answer = new int[answer_list.size()];
        for(int i = 0 ;i < answer.length; i++){
            answer[i] = answer_list.get(i);
        }
        
        return answer;
    }
}