import java.util.*;
class Solution {
public int[] solution(int[] progresses, int[] speeds) {
int[] day = new int[progresses.length];
//배포하는데 필요한 날짜를 저장한 queue
Queue<Integer> q = new LinkedList<Integer>();
for(int i = 0; i<progresses.length;i++){
if((100-progresses[i]) % speeds[i]==0){
day[i] = (100-progresses[i]) / speeds[i];
}
else{ // 나누어 떨어지지 않는 경우
day[i] = (100-progresses[i]) / speeds[i] + 1;
}
q.add(day[i]);
}
//몇개의 기능이 배포될 수 있는지를 저장한 list
List<Integer> list = new ArrayList<Integer>();
int cnt = 0; //배포 가능한 수 카운트
int before = q.peek(); //queue의 이전 값을 before에 저장
while(!q.isEmpty()){
//배포에 필요한 날짜가 이전보다 같거나 짧다면 -> 배포 불가능
if(q.peek()<=before){
q.poll(); //큐의 맨 앞에 있는 값 반환 후 삭제
cnt++; //카운트 증가
}
//배포에 필요한 날짜가 이전보다 크다면 -> 자기자신까지는 배포 가능
else{
list.add(cnt); //list에 카운트한 날짜를 추가
cnt = 1; //카운트값 초기화
before = q.poll(); //before값 초기화
}
}
list.add(cnt); //마지막 배포에 필요한 날짜 추가
//ArrayList to List
return list.stream().mapToInt(i -> i).toArray();
}
}
풀이
- 배포하는데에 기간이 얼마나 걸리는지를 저장한 queue에서 만약 이전(작업이 배포에 걸리는 시간)값이 현재(작업이 배포에 걸리는 시간)값보다 크거나 같다면 먼저 자기자신을 배포할 수 없다.
- 대신 자기 자신의 값이 이전 값보다 크다면 새롭게 카운트를 세서 현재 요소 이전에 있던 것들을 배포할 수 있다.
- 따라서 대소관계를 비교하고 카운트를 조건에 맞게 증가시켜주면서 몇개의 기능이 한번에 배포될 수 있는지를 저장하여 반환시켰다.