[프로그래머스 | Javascript] 기능개발

박기영·2022년 11월 30일
0

프로그래머스

목록 보기
103/159
post-custom-banner

solution

function solution(progresses, speeds) {
    let queue = [];
    
    const distributes = progresses.map((progress, index) => {
        const remain = 100 - progress;
        const distribute = Math.ceil(remain / speeds[index]);
        
        return distribute;
    })
    
    let ans = [];
    
    for(let i = 0; i < distributes.length; i++){
        if(queue.length === 0){
            queue.push(distributes[i]);
            continue;
        }

        if(queue[0] >= distributes[i]){
            queue.push(distributes[i]);
            continue;
        }
        
        if(queue[0] < distributes[i]){
            ans.push(queue.length);
            queue = [];
            queue.push(distributes[i]);
        }
    }
    
    if(queue.length !== 0){
        ans.push(queue.length);
    }
    
    return ans;
}

큐 구조를 이용한 직관적인 풀이이다.(사실 큐 구조의 특성을 이용하지는 않았지만)
우선 distributes라는 배포까지의 시간을 나타내는 배열을 구한다.
queue에 아무것도 들어있지않다면 우선 queue에 값을 넣어준다.
그렇다면 queue 가장 앞에 있는 값이 배포 단위의 기준이 될 것이다.

배포 준비 완료 기간이 queue 가장 앞에 있는 기간보다 작다면
먼저 배포 준비가 완료되더라도 배포 될 수 없다.
여기서 큐 구조를 느낄 수 있다. FIFO(First In First Out)
먼저 들어온 값이 나가기 전에는 아무것도 나갈 수가 없다.

그렇게 계속 queue에 값을 쌓아가다가,
queue에 들어가게 될 기간이 queue 맨 앞에 있는 기간보다 길다면
이 기능부터는 다음 배포 단위로 묶이게 된다.

따라서, queue에 들어있는 기능 개수, 즉, queue의 길이를 ans 배열에 넣어준다.

주의할 점은, 마지막 배포 단위는 queue에 남아있으므로
for문이 끝난 후 이를 처리해줘야한다는 것이다.

profile
나를 믿는 사람들을, 실망시키지 않도록
post-custom-banner

0개의 댓글