[JS] 택배 배달과 수거하기
FrontEnd/프로그래머스

[JS] 택배 배달과 수거하기

728x90

중요한 핵심은 모든 배달을 가져가기 위해선 뒤의 물건부터 배달 및 수거를 진행해야 한다. 따라서 아래와 같은 변수들을 활용해서 문제를 해결하였다.

 

배달을 뒤에서부터 할꺼이므로 반복문을 통해서 뒤부터 배열을 한바퀴 순회한다.

 

deli_space,pic_space => i번째 집까지배달했을때, 더 배달하거나 수거해야하는 짐의 개수

ret => 리턴해줄 총 길이

 

deli,pic => i번째 집에서 배달혹은 수거해야할 짐의 개수

 

deliCnt,picCnt => i번째 집에서 배달을 몇개까지 갈 수 있는지 정하는 변수

 

 

변수내용은 이렇게 방법은 아래와 같다.

 

 

말로만 설명하면 어려울 것 같으니 프로그래머스에서 준 예제를 통해서 어떻게 진행되는지 알아보자.

 

먼저 집5를 돌고나면 배달이 2개이므로 무조건 집5까지 한번은 가야한다.

 

즉 결과에 5 * 2 즉 10이란 결과를 저장해두고, 배달원은 배달2개, 수거 4개를 할 수 있는 상태가 된다.

조금 쉽게 생각하면 10이란 비용을 이미 지불했고, 배달2개와 수거4개를 공짜로 할 수 있다고 생각해도 될 것 같다.

 

ret => 10

deli_space => 2

pic_space => 4

가되게 된다.

 

집4를 돈 경우 배달 4개와 수거 4개를 할 수 있는데, 이미 집 5까지 갈때 공간들이 남아있기에

 

ret => 10

deli_space => 1

pic_space => 0

 

으로 추가 왔다갔다 할 필요 없이 배달이 가능해진다.

 

집 3을 도착한 경우, deli_space보다 필요한 배달이 더 많아지므로 추가적으로 배달을 1번 더진행해야한다.

이번엔 3번째 집이므로 3*2가 더해져야 한다.

 

여기서 deli_space 즉, 배달 1개는 공짜로 할 수 있기 때문에 배달을 3번 해야하지만 남는 공간이 1이 아니라 2가 되게 된다.

 

ret => 16

deli_space => 2

pic_space => 4

 

 

집 2 을 도착한 경우 같은 방식으로

 

ret => 16

deli_space => 2

pic_space => 1

 

마지막 집 1에서도

 

ret => 16

deli_space => 1

pic_space => 1

 

 

위와 같은 방법으로 결과 16이 나오게 된다.

 

 

 

function solution(cap, n, deliveries, pickups) {
    
    let deli_space=0
    let pic_space=0
    let ret = 0
    for (let i = pickups.length-1;i>=0;i--){
        
        let deli = deliveries[i]
        if (deli > deli_space){
            deli -= deli_space
            deli_space = 0
        }
        else {
            deli_space -= deli
            deli = 0
        }
        let pic = pickups[i]
        if (pic > pic_space){
            pic -= pic_space
            pic_space = 0
        }
        else {
            pic_space -=  pic
            pic = 0
        }
        
        const deliCnt = deli%cap ? ~~(deli/cap) +1 : deli/cap
        const picCnt = pic%cap ? ~~(pic/cap) +1  :pic/cap
        
        const goCnt = Math.max(deliCnt,picCnt)
        ret += goCnt * (i+1) * 2
        deli_space += goCnt*cap - deli
        pic_space += goCnt*cap - pic
        }
    
    
    return ret
}
728x90

'FrontEnd > 프로그래머스' 카테고리의 다른 글

[JS] 마법의 엘리베이터  (0) 2023.05.29
[JS] 이모티콘 할인 행사  (0) 2023.05.27
[JS] 시소 짝꿍  (0) 2023.05.26
[JS] 숫자 변환하기  (0) 2023.05.24
[JS] 뒤에 있는 큰 수 찾기  (0) 2023.05.23