Algorithm/Programmers

[알고리즘/프로그래머스/고득점Kit] 기능개발(JS)

개발자 김비숑 2023. 9. 9. 19:09
반응형

문제


https://school.programmers.co.kr/learn/courses/30/lessons/42586?language=javascript 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

풀이


1. 큐에 각 작업이 걸리는 시간을 저장한다.

2. 큐를 돌면서 최댓값보다 작거나 같으면 cnt를 증가시키고, 아니면 answer에 같이 배포할 날짜를 넣어주고 maxVal를 갱신한다.

 

언뜻 보면 간단한 거 같지만 헷갈리는 부분들이 있었다. 

먼저, 큐의 첫 번째 값은 미리 cnt를 세고 시작한다. 이를 위해 maxVal를 queue[0]으로 초기화하고 큐의 순회도 i=1부터 시작한다.

다음으로 큐의 마지막까지 배포하기 위해 큐를 모두 돌고 나서 answer.push(cnt)를 한 번 더 해준다. 

예를 들어, 첫 번째 예제처럼 queue(걸리는 날짜)가 [7, 3, 9]인 경우를 살펴보자. 마지막 9에서 else문으로 가서 answer.push(2)를 하고, maxVal = 9, cnt = 1로 할당한 뒤 끝나버린다. 이때 마지막 9까지 포함시키기 위해 answer.push(cnt)를 한 번 더 해준다. 

function solution(progresses, speeds) {
    // 각각 걸리는 시간을 저장하고, queue에 저장.
    // 이전 날짜보다 더 적게 걸린 경우 배포 cnt+1, 아니면 answer에 넣고, maxVal 갱신 
    const queue = progresses.map((prog, i) => Math.ceil((100 - progresses[i]) / speeds[i]))
    let maxVal = queue[0]
    let cnt = 1
    const answer = []
    
    for (let i=1;i<queue.length;i++) {
        if (queue[i] <= maxVal) {
            cnt += 1
        } else {
            answer.push(cnt)
            maxVal = queue[i]
            cnt = 1
        }
    }
    answer.push(cnt)
    return answer
}

 

스택/큐는 기반을 다지는 느낌인데 벌써부터 헷갈려서 어떡하나 싶다.. 꾸준히 해야지..! 

반응형