import java.util.Stack;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
Stack<Integer> stack = new Stack<>();
int[] neededDays = new int[progresses.length];
for(int i=0;i<progresses.length;i++){
neededDays[i] = (100-progresses[i])/speeds[i];
if((100-progresses[i])%speeds[i]!=0) neededDays[i]+=1;
}
int cnt=1;
int must=neededDays[0];
for(int i=1;i<neededDays.length;i++) {
if(must>=neededDays[i]) {
cnt++;
}else{
stack.add(cnt);
must = neededDays[i];
cnt=1;
}
if(i==neededDays.length-1) stack.add(cnt);
}
int[] answer = new int[stack.size()];
for(int i=answer.length-1;i>=0;i--) {
answer[i]=stack.pop();
}
return answer;
}
}
int[] neededDays
: 각 기능의 진도율이 100 이상이 되기 위해 필요한 날의 수neededDays[i] = (100-progresses[i])/speeds[i];
if((100-progresses[i])%speeds[i]!=0) neededDays[i]+=1;
-`needDays[i]`= `(100이 되기 위해 더 필요한 진도율)/(개발 속도)`
-여기서 if문은 필요한 날이 딱 떨어지지 않는 경우, (예를 들어 5.5일이 필요한 경우)를 처리한다.
Stack<Integer> stack
: 각 배포마다 개발되는 기능의 수들을 저장
int cnt
: 각 배포마다 개발되는 기능의 수
int must
: 이번 배포를 위해 반드시 요구되는 날의 수 (=이번 배포가 진행되는 시점이라고 볼 수도 있다)
for문을 돌면서 must>=neededDays[i]
인 경우 (=해당 기능이 이미 개발이 끝난 경우) i번째 기능 또한 배포에 포함시키는 것으로 결정되며 따라서 cnt가 1 증가된다.
must<neededDays[i]
인 경우 (=해당 기능 개발이 아직 완료되지 않은 경우) i번째 기능 전까지 배포에 포함되게 되어 이번 배포가 끝난다.
if(i==neededDays.length-1) stack.add(cnt);
를 만드시 해주어야 한다.