[JS] 스택/큐 > 기능개발
function solution(progresses, speeds) {
var answer = [];
for(var i = 0; i < progresses.length; i++){
var day = 0;
while(progresses[i] < 100){
progresses[i] += speeds[i];
day++;
}
answer.push(day);
}
var arr = [];
var count = 1;
var val = answer[0];
for(var i = 0; i < answer.length; i++){
if(val>=answer[i+1]){
count++;
}else{
arr.push(count);
count = 1;
val = answer[i+1];
}
}
return arr;
}
먼저 progresses 배열에서 값이 100이 되어야지만 작업이 완료되었다는 의미이기에 100이 될 때까지 speed를 더해주고, 100이 되면 며칠이 걸렸는지를 나타내는 변수 day을 배열에 담아준다.
그러면 progresses가 [93, 30, 55], speeds가 [1, 30, 5]일 때 answer은 [ 7, 3, 9 ]가 된다.
answer 배열에서 앞의 인덱스가 뒤의 인덱스값보다 크거나 같다면 앞의 작업이 끝나기 전에 뒤의 작업이 끝나거나, 같은 날짜에 작업이 끝나는 것을 의미하기에
7과 3일의 기간이 걸리는 작업은 같은 날짜에 두 작업을 완료할 수 있고, 9일의 작업은 다른 날짜에 따로 완료할 수 있다.
progresses가 [95, 90, 99, 99, 80, 99]고 speeds가 [1, 1, 1, 1, 1, 1]일 때는 answer가 [ 5, 10, 1, 1, 20, 1 ]가 된다.
[0]과 [1]을 비교할 때 [0]이 끝날 때까지 [1]가 끝나지 않으니 [0]이 완료되는 날 완료되는 작업은 하나, [1]이 완료되는 날엔 [2], [3]의 작업도 같이 처리할 수 있으므로 세 작업이 모두 끝, [4],[5]도 같은 날에 처리할 수 있다.
이러한 로직을 처리하기 위해 배열 하나와 몇 개의 작업이 끝나는지 나타내는 변수 count, 그리고 기준이 되는 날짜를 담을 val을 선언해준다.
answer를 반복하면서 만약에 val가 뒤의 값보다 크거나 같다면 count를 올려주고 만약에 작다면 배열에 count를 넣어준 후, count를 1로 다시 초기화하고 val은 다음 값으로 변경해준다.
그러면 위와 같이 동작하게 되며 arr을 리턴해주면 된다.