본문 바로가기
Programmers/Lv.2

[프로그래머스] Lv.2 택배 배달과 수거하기 JAVA 풀이

by Poorm 푸름 2024. 2. 5.

문제 Lv.2 택배 배달과 수거하기


: 나열된 n개의 집에 택배를 배달
: 택배 상자 = 물류창고에 보관
  ( i번째 집은 물류창고에서 거리 i만큼 떨어져 있다 )
  (또한 i번째 집은 j번째 집과 거리 j - i만큼 떨어져 있습니다. (1 ≤ i ≤ j ≤ n) )


: 트럭 허용 범위 = 최대 cap개의 박스 ( 각 집에 배달 및 수거할 때 원하는 개수만큼 가능 )
: 트럭은 재활용 택배 상자들을 실어 각 집에 배달하면서 빈 상자들을 수거해 물류창고에 돌아오는 최소 이동거리 구하기

 

<예시>

cap=4 일 때, 최소 거리로 이동하면서 5개의 집에 배달 및 수거

 

  집1 집2 집3 집4 집5
 배달  1 0 3 1 2
수거 0 3 0 4 0

 

  집1 집2 집3 집4 집5
 배달 / 수거 1/0 0/3 3/0 1/4 2/0
설  명 물류창고에서 택배 3개를 트럭에 싣고 출발
 배달 / 수거 1/0 0/3 3/0 0/4 0/0
설  명 물류창고 - 5번째 집까지 이동 (= 거리 5) 
4번째 집에 택배 1개 배달, 5번째 집에 택배 2개 배달
 배달 / 수거 1/0 0/3 3/0 0/0 0/0
설  명 창고에 내리고 택배 4개를 트럭에 싣기
 배달 / 수거 0/0 0/3 0/0 0/0 0/0
설  명 물류창고 - 3번째 집까지 이동 (거리 3)
1번째 집에 택배 1개 배달, 3번째 집에 택배 3개 배달
 배달 / 수거 0/0 0/0 0/0 0/0 0/0
설  명 3번째 집 - 물류창고까지 이동 (거리 3)
2번째 집에 빈 택배 상자 3개 수거, 빈 택배 상자를 물류창고에 내립니다.

 

 

16(=5+5+3+3)의 거리를 이동하면서 모든 배달 및 수거를 마쳤습니다

 

 public long solution(int cap, int n, int[] deliveries, int[] pickups) {
        long answer = 0;
        int del = 0;
        int pick = 0;
        for (int i = n-1; i >= 0; i--) {
            if (deliveries[i] > 0 || pickups[i] > 0) {
                int cnt = 0;
                while (del < deliveries[i] || pick < pickups[i]) {
                    cnt++;
                    del += cap;
                    pick += cap;
                }
                del -= deliveries[i];
                pick -= pickups[i];
                answer += (i+1) * cnt * 2;
            }
        }
        return answer;
    }

 

 

:  public long solution(int cap, int n, int[] deliveries, int[] pickups) {

        long answer = 0;
        int del = 0;
        int pick = 0;
        for (int i = n-1; i >= 0; i--) {  마지막 집부터 차례대로
            if (deliveries[i] > 0 || pickups[i] > 0) {  배달 또는 수거해야할 집
                int cnt = 0;  방문 횟수 초기화
                while (del < deliveries[i] || pick < pickups[i]) {  상자의 개수가 현재 집 상자 개수보다 크다면 반복
    
                    cnt++;  현재 집에 방문해야 하는 횟수 측정
                    del += cap;  현재 집에서 배달, 수거 가능한 상자 개수 +
                    pick += cap;  한번 방문할 때 배달 또는 수거가 가능한 최대 개수 +
                }
                // 현재 집에 배달,수거를 한 이후
                del -= deliveries[i];  
                pick -= pickups[i];  물류센터로 돌아가지 않고 추가로 배달,수거를 할 수 있는 상자의 개수
                answer += (i+1) * cnt * 2;  이동거리 계산
            }
        }
        return answer;
    }






 

https://school.programmers.co.kr/learn/courses/30/lessons/150369

 

프로그래머스

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

programmers.co.kr