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;
    }
}