스택/큐 개념을 이용해 푸는 문제이다.
처음으로 고려해본 것은 반복문을 얼마나 써야할까? 였다.
최대한 중첩된 반복문을 사용하지 않고자 했다.
문제를 살펴보니, 본격적인 로직을 작성하기 앞서 사전에 해주어야 할 것 같았다.
1.각 작업들의 현재 진도율
2.각 작업이 하루동안 진행되는 속도
주어진 입력값을 가지고 남은 진도율을 계산하는 사전 작업이 필요했다.
for (let i=0; i<progresses.length; i++){
let a = Math.ceil( (100 - progresses[i]) / speeds[i] );
arr.push(a);
}
각 작업을 완료하기까지 잔여 일수를 구해주는 코드이다.
( 100 - 현재 작업의 진도율 ) / 작업의 속도
이렇게 구한 값들을 새로운 입력값으로 사용해서 본격적으로 문제가 원하는 결과 값을 구하는 로직을 작성해주면 된다.
만약 [5,3,4,5,2,7] 이라는 입력 값이 있다면,
처음 작업이 5일이 걸리고
두 번째 작업이 3일,
세 번째 작업이 4일,
네 번째 작업이 5일,
다섯 번째 작업이 2일,
여섯 번째 작업이 7일 걸리므로
[5,1]이라는 결과가 출력되어야 한다.
풀이를 단순하게 생각해보면,
배열의 첫 번째 값을 기준으로 정하고
반복문을 돌면서
다음으로 큰 수가 나올 때까지 count를 해준다.
만약, 다음 값이 작다면 계속 진행하고
크다면, count를 출력해준다.
function solution(progresses, speeds) {
var answer = [];
let arr = [];
// 사전에 해주어야 하는 계산작업
for (let i=0; i<progresses.length; i++){
let a = Math.ceil( (100 - progresses[i]) / speeds[i] );
arr.push(a);
}
// 위에서 새로 구한 입력값에 대한 결과를 구하는 본격적인 로직
let count = 1;
let a = arr[0];
for(let i=1; i<arr.length; i++){
if(a < arr[i]){
answer.push(count);
a=arr[i];
count = 1;
}else{
count++;
}
}
answer.push(count);
return answer;
}
다른 사람들의 풀이를 참고해보니 로직은 비슷하다.
다만, 적절한 변수의 이름이나, 고차함수를 이용한다는 점은 연습할 필요가 있을 것 같다.
function solution(progresses, speeds) {
var answer = [];
let restDays = progresses.map( (day,index) => Math.ceil( (100 - day) / speeds[index]) );
let count = 1;
let maxDay = restDays[0];
for(let i=1; i<restDays.length; i++){
if(maxDay < restDays[i]){
answer.push(count);
maxDay=restDays[i];
count = 1;
}else{
count++;
}
}
answer.push(count);
return answer;
}