본문 바로가기
코딩테스트(알고리즘)/프로그래머스

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

by Cafe Mocha 2023. 2. 10.

코딩테스트 연습 - 택배 배달과 수거하기 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

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

programmers.co.kr


알고리즘 : 그리디, 구현

 

문제가 길고 복잡했지만 차분히 풀다보니 생각보다 쉽게 풀렸다.

 

뒤쪽부터 확인하면서 cap만큼 제거하고 0이되면 pop시키는 방식을 사용했다.

ans에는 택배, 수거 중 i+1값이 큰 값을 기준으로 왕복 시간을 계산했다.

 

function solution(cap, n, deliveries, pickups) {
     let ans = 0;

  while (deliveries.length || pickups.length) {
    // 반복문 한번에 왕복을 계산
    //  deliveries 확인 -> 멀리있는것 부터 확인
    let w = cap;
    let dis1 = 0;
    let dis2 = 0;
    for (let i = deliveries.length - 1; i >= 0; i--) {
      if (deliveries[i] !== 0) {
        // 왕복 거리 더하기
        if (w === cap) dis1 = i + 1;
        if (deliveries[i] <= w) {
          w -= deliveries[i];
          deliveries.pop();
        } else {
          deliveries[i] -= w;
          break;
        }
      } else deliveries.pop();
    }

    w = cap;

    // 픽업 계산
    for (let i = pickups.length - 1; i >= 0; i--) {
      if (pickups[i] !== 0) {
        // 왕복 거리 더하기
        if (w === cap) dis2 = i + 1;
        if (pickups[i] <= w) {
          w -= pickups[i];
          pickups.pop();
        } else {
          pickups[i] -= w;
          break;
        }
      } else pickups.pop();
    }

    ans += Math.max(dis1, dis2) * 2;
  }
    return ans;
}