간단해 보이는데 엄청 오래 걸렸습니다..!!
우선 최소로 움직이기 위해서는
최대한 먼 곳부터 많이 배달하고, 먼 곳부터 많이 수거해야 합니다
가장 멀리에 있는 배달,수거 장소에서부터
배달과 수거를 cap만큼 진행합니다
배달과 수거를 모두 cap만큼 진행하는 것은
갈 때 cap만큼 배달하고, 올 때 cap만큼 수거하면 되기 때문입니다
deliveries 배열과 pickups 배열이 존재하는 동안
배달, 수거 2개의 함수를 만들어서 먼 곳부터 배달과 수거를 반복했습니다
둘 중 시작점이 더 먼 곳의 왕복 거리를 result에 추가해줬습니다
function solution(cap, n, deliveries, pickups) {
// 가장 먼 거리를 최소로 왔다갔다 해야 함
// 최대한 먼 곳부터 많이 배달하고, 먼 곳부터 많이 수거하기
let result = 0;
let deliveries_cnt = 0;
let pickups_cnt = 0;
//모두 0이면 안 움직여도 됨
if (deliveries.every((d) => d === 0) && pickups.every((p) => p === 0))
return 0;
//배달할 수 있는 만큼 배달
function get_delivery() {
const start = deliveries.length;
let i = deliveries.length - 1;
while (deliveries.length && deliveries_cnt + deliveries[i] <= cap) {
deliveries_cnt += deliveries[i];
deliveries.pop();
i--;
}
if (deliveries.length) deliveries[i] -= cap - deliveries_cnt;
return start;
}
//수거할 수 있는 만큼 수거
function get_pickup() {
const start = pickups.length;
let i = pickups.length - 1;
while (pickups.length && pickups_cnt + pickups[i] <= cap) {
pickups_cnt += pickups[i];
pickups.pop();
i--;
}
if (pickups.length) pickups[i] -= cap - pickups_cnt;
return start;
}
//배달하거나 수거해야 할 게 남아 있을 때까지
while (deliveries.length || pickups.length) {
deliveries_cnt = 0;
pickups_cnt = 0;
const delivery_start = get_delivery();
const pickup_start = get_pickup();
//둘 중 시작점이 더 먼 곳의 왕복 거리를 result에 추가
result += Math.max(delivery_start, pickup_start) * 2;
}
return result;
}
'🧠 알고리즘' 카테고리의 다른 글
[프로그래머스] 마법의 엘리베이터 JS (0) | 2024.01.12 |
---|---|
[프로그래머스] 숫자 변환하기 JS (1) | 2024.01.11 |
[프로그래머스] 시소 짝꿍 JS (0) | 2024.01.09 |
[프로그래머스] 뒤에 있는 큰 수 찾기 JS (1) | 2024.01.07 |
[프로그래머스] 무인도 여행 JS (0) | 2024.01.06 |