문제 이해
- 여러 기능을 동시 개발, 각각 진행도와 개발속도가 다름
- 앞선 기능이 완료되어야 뒤 기능도 함께 배포 가능
- 각 배포마다 몇 개의 기능이 배포되는지 구하기
핵심 아이디어
각 기능을 진행도 계산 함수로 만들어서 큐에 저장하고, 하루씩 시뮬레이션하면서 배포 가능한 기능들을 찾는다.
접근 방법
- 함수 생성: progress + speed * day 형태의 함수를 각 기능마다 생성
- 큐 활용: 순서대로 처리하기 위해 Queue 사용
- 시뮬레이션: 매일 front()로 체크하여 100 이상이면 pop()
- 배포 카운트: 연속으로 완성된 기능들을 같은 날 배포
코드
import java.util.*;
import java.util.function.Function;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
// 1. 각 기능을 함수로 만들어서 큐에 저장
Queue<Function<Integer, Integer>> queue = new LinkedList<>();
for (int i = 0; i < progresses.length; i++) {
final int progress = progresses[i];
final int speed = speeds[i];
queue.offer(day -> progress + speed * day);
}
// 2. 결과 저장
List<Integer> result = new ArrayList<>();
int day = 1;
// 3. 하루씩 증가하며 배포 체크
while (!queue.isEmpty()) {
int count = 0;
// 연속으로 완성된 기능들 찾기
while (!queue.isEmpty() && queue.peek().apply(day) >= 100) {
queue.poll();
count++;
}
if (count > 0) {
result.add(count);
}
day++;
}
return result.stream().mapToInt(i -> i).toArray();
}
}
핵심 포인트
- Function 인터페이스: 함수를 변수처럼 저장 가능
- final 키워드: 람다식에서 지역변수 사용 시 필요
- 시뮬레이션: 실제 개발 과정과 유사하게 날짜별로 체크
- 큐의 특성: FIFO로 순서대로 배포 처리
시간복잡도
O(N × D) - N은 기능 수, D는 최대 완성일
'Java > 알고리즘' 카테고리의 다른 글
| 스텍 / 큐 : 올바른 괄호 (1) | 2025.07.07 |
|---|---|
| 스텍 / 큐 : 같은 숫자는 싫어 (0) | 2025.07.07 |
| 스텍 / 큐 : 프로세스 (1) | 2025.07.03 |
| 스텍 / 큐 : 다리를 지나는 트럭 (1) | 2025.07.03 |
| 스텍 / 큐 : 주식가격 (0) | 2025.07.03 |