https://school.programmers.co.kr/learn/courses/30/lessons/42586
카테고리가 스택/큐 이긴 한데, 굳이 스택/큐가 필요없어보였다.
각 작업별로 처리에 필요한 시간은 [(100(%) - 진행률)/진행속도] 이다.
문제의 제한사항의 마지막 항목에 따라 소수점은 올림처리해야 한다. (올림처리하지않으면 마지막 테스트케이스가 실패한다.)
주요 로직은,
n번째 작업의 남은 시간(a)과 n-1번째 작업의 남은 시간(b)을 비교한다.
a > b 인 경우, 새로운 배포가 일어나야 한다.
a <= b 인 경우, b의 배포때 같이 배포된다.
위 로직을 기준으로 소스를 작성하면 아래와 같이 완성됨
import java.util.*;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
int total = 0;
int cnt = 0;
List<Integer> counter = new ArrayList();
for (int i = 0; i < progresses.length; i++) {
int progress = progresses[i];
int speed = speeds[i];
int duration = (int) Math.ceil((100.0 - progress) / speed);
if (i == 0) {
total = duration;
cnt++;
} else if (total < duration) {
total = duration;
counter.add(cnt);
cnt = 1;
} else {
cnt++;
}
}
counter.add(cnt);
return counter.stream().mapToInt(c -> (int) c).toArray();
}
}