문제풀이/기타

[JAVA] Pro 택배 배달과 수거하기

승무_ 2023. 7. 6. 19:18

문제

https://school.programmers.co.kr/learn/courses/30/lessons/150369?language=java 

 

프로그래머스

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

programmers.co.kr

코드

import java.util.*;

class Solution {
    public class house{
        int index;
        int value;
        house(int index, int value){
            this.index=index;
            this.value=value;
        }
    }
    
    public long solution(int cap, int n, int[] deliveries, int[] pickups) {
        long answer = 0;
        
        Queue<house> deli=new LinkedList<>();
        Queue<house> pick=new LinkedList<>();
        
        for(int i=deliveries.length-1; i>-1; i--){
            if(deliveries[i]!=0){
                deli.add(new house(i, deliveries[i]));
            }
            if(pickups[i]!=0){
                pick.add(new house(i, pickups[i]));
            }
        }
        
        while(true){
            if(deli.isEmpty() && pick.isEmpty()) break;
            
            // 가장 멀리 있는 집
            int temp=0;
            if(!deli.isEmpty()){
                temp=deli.peek().index;
            }
            if(!pick.isEmpty()){
                temp=Math.max(temp, pick.peek().index);
            }
            
            answer+=((temp+1)*2);
            
            // 배달
            int cur=cap;
            while(!deli.isEmpty()){
                house cur_h = deli.peek();
                if(cur_h.value<=cur){
                    cur-=cur_h.value;
                    deli.poll();
                }
                else{
                    cur_h.value-=cur;
                    break;
                }
            }
            
            // 수거
            cur=cap;
            while(!pick.isEmpty()){
                house cur_h = pick.peek();
                if(cur_h.value<=cur){
                    cur-=cur_h.value;
                    pick.poll();
                }
                else{
                    cur_h.value-=cur;
                    break;
                }
            }
            
        }
        
        return answer;
    }
}