처음에는 단순 배열 계산으로 구현하였으나,
배열을 스택으로 생각하여 맨 앞의 수를 가져와 이를 다음수와 비교하면서 스택에서 빼낸 원소의 수를 계산하는 방법으로 문제를 해결하였다
// 작업 시행 시간 구하는 함수 작성
function day (progress, speed){
let count = 0;
while(progress < 100){
count ++;
progress += speed;
}
return count;
}
function solution(progresses, speeds) {
let answer = [], result = [];
// 각 작업에 대한 여분 시간을 구하여 배열에 담음
for(let i = 0 ; i < progresses.length ; i++){
result.push(day(progresses[i], speeds[i]));
}
// 작업한 일의 수를 초기화
let task_count = 1;
// 결과 스택에 일이 없어질 때까지 반복
while(result.length != 0){
// 일단 맨 앞의 작업 수행시간을 가져오고
let task = result.shift();
// 다음 수부터 현재 진행중인 작업의 진행 시간과 비교하여
// 빼낼 작업의 수가 작거나 같으면 결과 스택에서 제거하고
// 작업한 일의 수를 한개 증가 시켜준다
// 만약 빼낼 작업의 진행시간이 현재 진행 중인 작업 시간보다 크다면
// 다음 일로 넘겨야 하므로 while문 종료
while(task >= result[0]){
result.shift();
task_count++;
}
// while문이 종료되고 나서의 진행된 작업의 수를 답 스택에 넣어주고
answer.push(task_count);
// 작업한 일의 수를 1로 초기화 한다
task_count = 1;
}
return answer;
}
함수와 스택을 따로 작성하지 않고 map과 배열을 통해 문제를 해결하였다
function solution(progresses, speeds) {
let answer = [];
// 나머지 작업 시간 담는 배열
let restProgresses = progresses.map((progress, index) => {
let count = 0;
// 100전까지 날짜를 하나씩 증가
while (progress < 100) {
progress += speeds[index];
count++;
}
return count;
})
// 처음 원소를 최대값으로 설정한후 반복문 수행
let finsh = 1;
let max = restProgresses[0];
for (let i = 1; i < restProgresses.length; i++) {
if (restProgresses[i] <= max)
finsh++;
else {
// 최대값보다 오래걸리는 일이면
// 같은날에 배포가 불가능하므로
// 답안에 작업한 일의 수를 넣어주고
// 작업한 일과 최대값을 초기화 시켜준다
answer.push(finsh)
finsh = 1;
max = restProgresses[i]
}
}
// 마지막 작업 결과 넣어주고 반환
answer.push(finsh)
return answer;
}