function solution(progresses, speeds) {
let queue = [];
const distributes = progresses.map((progress, index) => {
const remain = 100 - progress;
const distribute = Math.ceil(remain / speeds[index]);
return distribute;
})
let ans = [];
for(let i = 0; i < distributes.length; i++){
if(queue.length === 0){
queue.push(distributes[i]);
continue;
}
if(queue[0] >= distributes[i]){
queue.push(distributes[i]);
continue;
}
if(queue[0] < distributes[i]){
ans.push(queue.length);
queue = [];
queue.push(distributes[i]);
}
}
if(queue.length !== 0){
ans.push(queue.length);
}
return ans;
}
큐 구조를 이용한 직관적인 풀이이다.(사실 큐 구조의 특성을 이용하지는 않았지만)
우선 distributes
라는 배포까지의 시간을 나타내는 배열을 구한다.
queue
에 아무것도 들어있지않다면 우선 queue
에 값을 넣어준다.
그렇다면 queue
가장 앞에 있는 값이 배포 단위의 기준이 될 것이다.
배포 준비 완료 기간이 queue
가장 앞에 있는 기간보다 작다면
먼저 배포 준비가 완료되더라도 배포 될 수 없다.
여기서 큐 구조를 느낄 수 있다. FIFO(First In First Out)
먼저 들어온 값이 나가기 전에는 아무것도 나갈 수가 없다.
그렇게 계속 queue
에 값을 쌓아가다가,
queue
에 들어가게 될 기간이 queue
맨 앞에 있는 기간보다 길다면
이 기능부터는 다음 배포 단위로 묶이게 된다.
따라서, queue
에 들어있는 기능 개수, 즉, queue
의 길이를 ans
배열에 넣어준다.
주의할 점은, 마지막 배포 단위는 queue
에 남아있으므로
for
문이 끝난 후 이를 처리해줘야한다는 것이다.