본문 바로가기
알고리즘

[스택] 기능개발

by limew 2023. 10. 11.

https://school.programmers.co.kr/learn/courses/30/lessons/42586#

 

첫번째 풀이 (실패)

  1. progresses, speeds를 순회하여 각 기능마다 더 필요한 시간을 계산한다 Math.ceil( ( 100-progress ) / speeds );
  2. 필요한 시간 배열을 앞에서부터 순회하며 뒤에 더 많은 시간이 필요할때까지 앞의 시간안에 처리할 수 있는 기능의 합을 구한다

 

function solution(progresses, speeds) {
    var answer = [];
    const days = [];
    for (let i = 0; i < progresses.length; i++) {
        days.push(Math.ceil((100-progresses[i])/speeds[i])); // ceil
    }
    let queue = [];
    for (const day of days) {
        if (!queue.length) {
            queue.push(day);
            continue;
        }
        // 전보다 현재가 작거나 같으면
        if (queue[queue.length-1] >= day) {
            queue.push(day);
        } else {
            answer.push(queue.length);
            queue = [day]; // 
        }
    }
    return [...answer, queue.length]; // queue에 남은 것 넣어주기
}

 

반례

progresses = [90, 98, 97, 96, 98] , speeds = [1, 1, 1, 1, 1] 일때 답은 [5]

queue의 마지막과 다음의 크기를 비교하는게 아니라 queue에서 가장 큰 수와 다음을 비교

 

두번째 풀이 (성공)

전보다 많은 시간을 비교하는 로직에서 바로 전의 시간과 비교하는게 아니라 전 까지 중 최대 시간과 비교한다

function solution(progresses, speeds) {
    var answer = [];
    const days = [];
    for (let i = 0; i < progresses.length; i++) {
        days.push(Math.ceil((100-progresses[i])/speeds[i])); // ceil
    }
    let queue = [];
    let prevMax = 0;
    for (const day of days) {
        if (!queue.length) {
            queue.push(day);
            prevMax = day;
            continue;
        }
        // 바로 전과 비교하는게 아니라 전까지 최대를 비교
        if (prevMax >= day) {
            queue.push(day);
        } else {
            prevMax = day;
            answer.push(queue.length);
            queue = [day]; // 
        }
    }
    return [...answer, queue.length]; // queue에 남은 것 넣어주기
}