프로그래머스 - 기능개발(Java)

윤민선·2026년 9월 28일

프로그래머스

목록 보기
91/96
post-thumbnail

문제 설명

현재 진도 progresses와 개발 속도 speeds가 주어질 때, 배포되는 기능의 개수를 순서대로 반환하는 문제이다.

앞의 기능이 먼저 배포되어야 뒤의 기능도 함께 배포할 수 있다.


접근 방법

먼저 각 기능이 완성되기까지 필요한 일수를 계산한다.

그다음 Queue에 순서대로 넣고 앞에서부터 확인한다.

  • 현재 기능의 완료일이 기준 배포일보다 작거나 같으면 → 같이 배포
  • 더 늦게 완료되면 → 새로운 배포 그룹 생성

풀이 순서

  1. 각 기능의 남은 작업량을 계산한다.
  2. 속도로 나누어 완료까지 필요한 일수를 구한다.
  3. 나누어 떨어지지 않으면 하루를 추가한다.
  4. 완료 일수를 Queue에 저장한다.
  5. 가장 앞 기능의 완료일을 기준 배포일로 정한다.
  6. 뒤의 기능들을 확인하면서 함께 배포할 수 있는 기능의 개수를 센다.
  7. 새로운 배포일이 나오면 이전 개수를 저장하고 다시 센다.
  8. List를 int[] 배열로 변환한다.

최종 코드

import java.util.*;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        Queue<Integer> daysQueue = new LinkedList<>();

        // 1. 각 작업별 완료까지 걸리는 일수 계산
        for (int i = 0; i < progresses.length; i++) {
            int remain = 100 - progresses[i];

            int day = remain / speeds[i];

            if (remain % speeds[i] != 0) {
                day += 1;
            }

            daysQueue.add(day);
        }

        List<Integer> answerList = new ArrayList<>();

        // 2. 큐를 돌면서 함께 배포될 수 있는 개수 계산
        int maxDay = daysQueue.poll();
        int count = 1;

        while (!daysQueue.isEmpty()) {
            int nextDay = daysQueue.poll();

            if (maxDay >= nextDay) {
                count++;
            } else {
                answerList.add(count);

                count = 1;
                maxDay = nextDay;
            }
        }

        // 마지막 배포 그룹 추가
        answerList.add(count);

        // 3. List를 배열로 변환
        return answerList.stream()
                         .mapToInt(i -> i)
                         .toArray();
    }
}

실행 결과

0개의 댓글