본문 바로가기

문제 풀이/Programmers

[프로그래머스] 기능개발 (JAVA)

문제 출처 - Programmers

문제는 여기

 

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

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

programmers.co.kr


[풀이]

1. 업무가 끝나기까지 얼마가 걸리는지 구해준다.

2. 현재 큐가 비어있지 않고, 큐의 peek()과 현재 업무가 끝나는 데 걸리는 시간을 비교한다.

3. 시간보다 적으면 해당 업무가 끝나기 전에 현재 업무가 끝나는 것이므로 큐에 담아준다.

4. 시간보다 많으면 이전까지 큐에 담긴 수가 업무를 처리할 수 있는 수가 되고, 이를 list에 담아준다.

5. 모든 업무를 마칠 때까지 반복한다.

6. 리스트에 담긴 값들을 배열에 담아주고 이를 출력한다.

[접근]

 

[코드]

import java.util.*;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        Queue<Integer> q = new LinkedList<>();
        // 크기를 몰라서 배열말고 리스트 썼음
        ArrayList<Integer> list = new ArrayList<>(); 

        for (int i = 0; i < speeds.length; i++) {
            double task = (100 - progresses[i]) / (double) speeds[i];
            // 남은 업무량에 대한 남은 일 (올림)
            int date = (int) Math.ceil(task);

            // 큐에 값이 있고
            // 큐 값이 남은 일 수보다 적으면 지금까지 한 일의 수를 출력해야함
            if (!q.isEmpty() && (q.peek() < date)) {
                list.add(q.size());
                q.clear();
            }

            // 큐에 걸리는 일자 담기
            q.offer(date);
        }

        list.add(q.size());
        
        // 결과를 출력하기 위한 배열에 값 담기
        int[] answer = new int[list.size()];

        for (int i = 0; i < answer.length; i++) {
            answer[i] = list.get(i);
        }

        return answer;
    }
}