queue(FIFO)의 특성을 활용하여 풀어야 하는 문제이다.
1차) 1차 접근 시에는 덧셈 progresses[i]+=speeds[i];
이 아닌 나눗셈Math.ceil((100-progresses[i])/speeds[i]);
으로 작업이 끝나기까지 남은 일수를 구하고 그 값들은 한 배열 안에 넣어 비교하려 했으나 배열을 만들 때와 배열 내부 비교에 사용되는 for문이 과도한 듯 하여 다른 방식을 시도하였다.
2차) 그 결과 가장 앞에 위치하는 작업이 완료되는 때에 뒤에 위치한 요소들 중 조건을 충족하는 경우를 모두 shift처리하는 식으로 비교 대상을 줄여나갔다.
function solution(progresses, speeds) {
let answer = [];
let doneList = [];
while(progresses.length>0){
for(let i=0;i<progresses.length;i++){
progresses[i]+=speeds[i];
}
if(progresses[0]>=100){
for(let i=0;i<progresses.length;i++){
if(progresses[i]>=100){
doneList.push(progresses[i]);
}else{
break;
}
}
answer.push(doneList.length);
while(doneList.length>0){
progresses.shift();
speeds.shift();
doneList.shift();
}
}
}
return answer;
}
for(let i=0;i<progresses.length;i++){
progresses[i]+=speeds[i];
}
가장 앞에 위치한 작업이 완성되어 배포 가능 상태가 될 때까지 진도율에 개발 속도를 더해나간다.
if(progresses[0]>=100)
for(let i=0;i<progresses.length;i++){
if(progresses[i]>=100){
doneList.push(progresses[i]);
}else{
break;
}
}
배포 가능 상태가 되면 뒤에 있는 요소들을 확인하여 진도율이 100%를 넘었다면 doneList에 push한다. 100%미만의 작업을 만나면 반복문을 종료한다.
doneList(배포 가능한 작업)의 길이를 answer 배열에 push하고 doneList의 길이만큼 progresses와 speeds, doneList의 요소를 제거한다. 이 때 요소는 FIFO로 진행되어야 하므로 shift를 이용한다.