본문 바로가기

코딩 테스트/PROGRAMMERS

[Java] Lv.2 택배 배달과 수거하기

문제

 

문제 풀이

스택을 활용한 풀이를 진행했다.

처음부터 마지막 집까지 배달 / 수거해야하는 상자의 개수만큼 각각의 스택에 push한다.

이후 두 스택 중 하나가 빌때까지 cap의 크기만큼 스택을 비우고 두 스택 중 들어있는 집번호 크기가 큰 쪽 * 2를 활용하여 이동거리를 +해준다.

 

이후 비지않은 남은 스택을 빌때까지 cap수만큼 pop 해주며 이동 거리를 더해준다. 

자바 코드

import java.util.*;
class Solution {
    private final Stack<Integer> deliver = new Stack<>();
    private final Stack<Integer> pickup = new Stack<>();
    public long solution(int cap, int n, int[] deliveries, int[] pickups) {
        long answer = 0;
        
        // 각 집 별로 배달/수거 해야하는 물건의 수만큼 스택에 추가
        for(int i = 0; i < n; i++){
            for(int j = 0; j < deliveries[i]; j++){
                deliver.push(i + 1);
            }
            
            for(int j = 0; j < pickups[i]; j++){
                pickup.push(i + 1);
            }
        }
        
        // 이동거리 구하기
        while(!deliver.isEmpty() && !pickup.isEmpty()){
            int lastD = deliver.peek();
            int lastP = pickup.peek();
            
            // 둘 중 하나가 빌 때까지
            // cap수 만큼 배달 and 수거하기
            for(int i = 0; i < cap; i++){
                if(!deliver.isEmpty())
                    deliver.pop();
                if(!pickup.isEmpty())
                    pickup.pop();
            }
            
            // 이동거리는 가장 멀리 배달 or 수거간 집의 거리 * 2
            answer += Math.max(lastD, lastP) * 2;
        }
        
        // 남은 배달 혹은 수거를 빌때까지 반복
        // 위의 while에서 배달이 먼저 다비면 맨 아래 while문이
        // 수거가 먼저 다 비면 바로 아래의 while문이 동작한다.
        while(!deliver.isEmpty()){
            int last = deliver.peek();
            
            for(int i = 0; i < cap; i++){
                if(!deliver.isEmpty())
                    deliver.pop();
            }
            
            answer += last * 2;
        }
        
        while(!pickup.isEmpty()){
            int last = pickup.peek();
            
            for(int i = 0; i < cap; i++){
                if(!pickup.isEmpty())
                    pickup.pop();
            }
            
            answer += last * 2;
        }
        
        return answer;
    }
}

 

'코딩 테스트 > PROGRAMMERS' 카테고리의 다른 글

[Java] Lv.2 유사 칸토어 비트열  (0) 2024.06.13
[Java] Lv.2 마법의 엘리베이터  (2) 2024.06.11
[Java] Lv2 시소 짝꿍  (2) 2024.06.11
[Java] Lv.2 미로 탈출  (2) 2024.06.06
[Java] Lv.2 혼자서 하는 틱택토  (0) 2024.06.04