알고리즘 문제풀이/프로그래머스 문제풀이

프로그래머스 문제 풀이 - 기능개발(큐)

줄라이퍼스트 2025. 8. 4. 16:33

 

이 문제는 각 기능별로 개발 완료까지 남은 일수를 계산하고,
앞 기능이 완료되지 않으면 뒤 기능도 함께 대기해야 하는 상황을 시뮬레이션하는 문제

즉, 뒤에 있는 기능이 먼저 완성돼도 앞 기능이 끝날 때까지 기다렸다가 함께 배포돼어야 함

 

 

여러 기능이 동시에 개발 중인데, 앞에 있는 기능이 완성되지 않으면 뒤에 있어도 배포가 지연되는 구조

 

  • 각 기능별로 남은 작업일을 계산
  • Queue를 사용해 순서를 유지
  • 앞 기능 보다 빠르게 끝난 기능들을 같은 날 묶어서 배포

 

import java.util.*;

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

        // 각 작업이 완료되기까지 걸리는 남은 일수 계산
        int[] daysLeft = new int[n];
        for (int i = 0; i < n; i++) {
            // Math.ceil을 사용해 올림 처리 -> 하루 단위로 배포되므로 소수점 이하는 올림
            daysLeft[i] = (int) Math.ceil((100.0 - progresses[i]) / speeds[i]);
        }

        int count = 0;            // 현재 배포 그룹의 기능 개수
        int maxDay = daysLeft[0]; // 현재 배포 그룹의 기준일 (앞 기능이 끝나는 날짜)

        for (int i = 0; i < n; i++) {
            if (daysLeft[i] <= maxDay) {
                // 앞 기능보다 먼저 혹은 같은 날 끝나면 함께 배포 가능
                count++;
            } else {
                // 앞 기능보다 늦게 끝나면 새 배포 그룹 시작
                queue.add(count);         // 지금까지 묶인 배포 개수 저장
                count = 1;                // 새로운 그룹 시작
                maxDay = daysLeft[i];     // 새 기준일 갱신
            }
        }

        // 마지막 그룹도 추가
        queue.add(count);

        // Queue -> int[] 변환
        return queue.stream().mapToInt(i -> i).toArray();
    }
}