Coding Study/Programmers
[프로그래머스] lv2 택배 배달과 수거 -JAVA(자바)
머준
2023. 2. 2. 23:52
[프로그래머스] 택배 배달과 수거
[출처- 프로그래머스 택배 배달과 수거]
https://school.programmers.co.kr/learn/courses/30/lessons/150369
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
제한 사항
입출력 예
전체 코드
/*
가장 멀리 있는 집 먼저 방문해야 최선
*/
import java.util.*;
class Solution {
public long solution(int cap, int n, int[] deliveries, int[] pickups) {
long answer = 0;
int box = 0; // 배송할 택배의 갯수
Stack<Integer> deli = new Stack<>(); // 배달 택배 갯수
Stack<Integer> pickup = new Stack<>(); // 수거 택배 갯수
for(int i: deliveries) {
deli.push(i);
}
for(int i: pickups) {
pickup.push(i);
}
// [0,0,0,0,0] 반례 (즉, 마지막 배달or수거 중 0값 제거)
while(!deli.isEmpty() && deli.peek() == 0) {
deli.pop();
}
while(!pickup.isEmpty() && pickup.peek() == 0) {
pickup.pop();
}
while(!deli.isEmpty() || !pickup.isEmpty()) {
// 가장 멀리 있는 집으로부터 왕복 거리
answer += Math.max(deli.size() * 2, pickup.size() * 2);
box = 0;
while(!deli.isEmpty() && box <= cap) {
// deli.peek() 집에 배송할 택배를 전부 실을 수 있을 때
if(deli.peek() + box <= cap) {
box += deli.peek();
} else {
// 전부 실을 수 없을 때
int tmp = deli.pop();
tmp -= (cap - box);
deli.push(tmp);
break;
}
deli.pop();
}
box = 0;
while(!pickup.isEmpty() && box <= cap) {
// pickup.peek() 집에 배송할 택배를 전부 실을 수 있을 때
if(pickup.peek() + box <= cap) {
box += pickup.peek();
} else {
// 전부 실을 수 없을 때
int tmp = pickup.pop();
tmp -= (cap - box);
pickup.push(tmp);
break;
}
pickup.pop();
}
}
return answer;
}
}