## 🌟 문제
[코딩테스트 연습 - 기능개발 \| 프로그래머스 스쿨](https://school.programmers.co.kr/learn/courses/30/lessons/42586)
각 기능의 작업 진도(progresses)와 개발 속도(speeds)가 주어질 때, 각 배포마다 몇개의 기능이 배포되는지 구하기. 기능은 순차적으로 배포되어야 하기 때문에 앞 기능이 완료되지 않으면 뒤 기능이 완료되어도 배포할 수 없다.
## 🌟 풀이
배포는 앞에서부터 순차적으로 이루어진다는 것이 중요했다. 뒤쪽 기능이 먼저 완료될 수 있더라도 일단 앞쪽 기능을 먼저 완료시켜야 했다.
1. 날짜를 1일씩 증가시키며 각 날짜에 완료 가능한 작업들을 확인한다.
2. 현재까지 배포된 작업 다음 것부터 순차적으로 체크한다.
3. 작업 진도가 100 이상이 되는 작업들은 연속으로 세어준다.
4. 만약 진도가 100 미만아 되는 작업이 있다면 세는 것을 중단한다. (어차피 뒤 작업들 모두 배포 못함)
5. 완료된 작업이 있다면 배포하고 개수를 기록한다.
각 날짜마다 `진도 + (속도 × 경과일수)` 로 현재 진행도를 매번 계산해서 별도로 진행도 배열을 관리하지 않아도 되게 했다.
```javascript
function solution(progresses, speeds) {
let answer = [];
let currentDay = 1;
let deployCount = 0;
while (deployCount < progresses.length) {
let completedCount = deployCount;
// 작업
while (completedCount < progresses.length) {
if (
progresses[completedCount] + speeds[completedCount] * currentDay <
100
)
break;
completedCount++;
}
// 배포
if (deployCount !== completedCount) {
answer.push(completedCount - deployCount);
deployCount = completedCount;
}
currentDay++;
}
return answer;
}
```
> **시간 복잡도**
> 최악의 경우 모든 작업이 하루에 하나씩 완료된다면 시간 복잡도는 **O(N × D)** (N은 작업 수, D는 최대 소요 일수)가 된다. 하지만 작업 개수, 작업 진도, 작업 속도 가 모두 100 이하의 값들이기 때문에 괜찮았다.