https://school.programmers.co.kr/learn/courses/30/lessons/150369
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
📌 자바(Java)로 푸는
택배 배달과 수거하기 - 프로그래머스
🚚📦
🔎 문제 개요
프로그래머스 Lv.2 - 택배 배달과 수거하기 문제입니다.
트럭이 정해진 용량(cap)만큼 배달/수거를 하며 모든 집에 물건을 배달하고 수거하려고 합니다.
왕복 이동 거리의 최솟값을 구하는 것이 목표입니다.
💡 예제 입력
cap = 4, n = 5
deliveries = [1, 0, 3, 1, 2]
pickups = [0, 3, 0, 4, 0]
💡 예제 출력
16
➡ 물건을 배달하고 수거하기 위해 왕복한 거리의 총합이 16
🛠 알고리즘 접근 방식
이 문제는 거꾸로(가장 먼 집부터) 순회하면서, cap 만큼 배달/수거를 처리하며 왕복 횟수를 누적하는 방식으로 해결할 수 있습니다.
✏️ 핵심 아이디어
- 먼 집부터 처리하면 한 번 갈 때 최대한 많은 배달/수거를 묶을 수 있음
- 배달과 수거는 동시에 가능하므로 두 작업을 같이 관리
- deliver, pickup은 **남은 잔여 작업량(미처리된 수량)**을 의미
🔹 Java 코드 해설
class Solution {
public long solution(int cap, int n, int[] deliveries, int[] pickups) {
long answer = 0;
int deliver = 0;
int pickup = 0;
for(int i = n - 1; i >= 0; i--) {
deliver -= deliveries[i];
pickup -= pickups[i];
// 현재 위치에서 처리해야 할 배달 또는 수거가 남아 있다면,
while (deliver < 0 || pickup < 0) {
deliver += cap;
pickup += cap;
answer += (i + 1) * 2; // 왕복 거리 추가
}
}
return answer;
}
}
🔍 코드 설명
📌 1. 뒤에서부터 순회하는 이유
for(int i = n - 1; i >= 0; i--)
✔ 먼 거리부터 먼저 배달/수거 → 왕복 횟수 최소화
✔ 이후 집은 같은 이동으로 묶어서 처리 가능
📌 2. 잔여 작업량 계산
deliver -= deliveries[i];
pickup -= pickups[i];
✔ 현재 집에서 배달할 양과 수거할 양을 각각 차감
✔ 남은 양이 0보다 작다는 건 아직 더 가져가야 한다는 의미
📌 3. 필요한 만큼 트럭 보내기
while (deliver < 0 || pickup < 0) {
deliver += cap;
pickup += cap;
answer += (i + 1) * 2;
}
✔ 남은 배달/수거량이 존재할 때마다 트럭 한 번 더 왕복
✔ cap만큼만 처리 가능하므로 누적하면서 반복 수행
🏆 정리
✅ 핵심 포인트
✔ 먼 곳부터 처리 → 왕복 거리 최소화
✔ 한 번 갈 때 배달/수거를 함께 처리하여 최적의 거리 확보
✔ 그리디 방식 + 누적 처리
🎯 이 알고리즘의 장점
✅ 복잡한 조건 없이도 간단한 반복문으로 해결 가능
✅ 트럭의 적재량(cap)을 잘 활용하여 최적화 가능
✅ 현실적인 배달/수거 로직을 반영한 좋은 시뮬레이션 문제
필요하면 이 문제에 대한 블로그 글 형태로도 정리해드릴게요! 😊
'Algorithm & Data Structures > Programers' 카테고리의 다른 글
Lv 4. 무지의 먹방 라이브 (2) | 2025.04.08 |
---|---|
Lv 3. 광고 삽입 (0) | 2025.04.03 |
Lv 4. 호텔 방 배정 (4) | 2025.03.21 |
Lv 3. 미로 탈출 명령어 (0) | 2025.03.17 |
Lv 2. 지게차와 크레인 (0) | 2025.03.13 |