중요한 핵심은 모든 배달을 가져가기 위해선 뒤의 물건부터 배달 및 수거를 진행해야 한다. 따라서 아래와 같은 변수들을 활용해서 문제를 해결하였다.
배달을 뒤에서부터 할꺼이므로 반복문을 통해서 뒤부터 배열을 한바퀴 순회한다.
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
}
'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 |