본문 바로가기
🧠 알고리즘

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

by megan07 2024. 1. 10.

문제 링크

 

간단해 보이는데 엄청 오래 걸렸습니다..!!

 

우선 최소로 움직이기 위해서는
최대한 먼 곳부터 많이 배달하고, 먼 곳부터 많이 수거해야 합니다

가장 멀리에 있는 배달,수거 장소에서부터
배달과 수거를 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;
}