본문 바로가기

Tech/Problem Solving

[프로그래머스] 스택/큐 - 다리를 지나는 트럭 (Java)

 

 

코딩테스트 연습 - 다리를 지나는 트럭

트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 다리에는 트럭이 최대 bridge_length대 올라갈

programmers.co.kr

 

문제 설명

트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 다리에는 트럭이 최대 bridge_length대 올라갈 수 있으며, 다리는 weight 이하까지의 무게를 견딜 수 있습니다. 단, 다리에 완전히 오르지 않은 트럭의 무게는 무시합니다.

예를 들어, 트럭 2대가 올라갈 수 있고 무게를 10kg까지 견디는 다리가 있습니다. 무게가 [7, 4, 5, 6]kg인 트럭이 순서대로 최단 시간 안에 다리를 건너려면 다음과 같이 건너야 합니다.


경과 시간 다리를 지난 트럭 다리를 건너는 트럭 대기 트럭
0 [] [] [7,4,5,6]
1~2 [] [7] [4,5,6]
3 [7] [4] [5,6]
4 [7] [4,5] [6]
5 [7,4] [5] [6]
6~7 [7,4,5] [6] []
8 [7,4,5,6] [] []

따라서, 모든 트럭이 다리를 지나려면 최소 8초가 걸립니다.

solution 함수의 매개변수로 다리에 올라갈 수 있는 트럭 수 bridge_length, 다리가 견딜 수 있는 무게 weight, 트럭 별 무게 truck_weights가 주어집니다. 이때 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 return 하도록 solution 함수를 완성하세요.

 
제한 조건
  • bridge_length는 1 이상 10,000 이하입니다.
  • weight는 1 이상 10,000 이하입니다.
  • truck_weights의 길이는 1 이상 10,000 이하입니다.
  • 모든 트럭의 무게는 1 이상 weight 이하입니다.
입출력 예
bridge_length weight truck_weights return
2 10 [7,4,5,6] 8
100 100 [10] 101
100 100 [10,10,10,10,10,10,10,10,10,10] 110

풀이

다리에 진입하는 트럭을 담는 자료 구조에 큐를 사용한다.

 

트럭이 다리에 진입하기 위한 조건

1. 큐의 크기가 bridge_length보다 작아야한다.

2. 기존에 다리에 진입한 트럭의 무게와 현재 진입하려는 트럭의 무게의 합이 weight를 넘어서면 안된다.

 

트럭이 다리에서 빠져나가기 위한 조건

1. 현재 시간과 큐에서 빠져나가려는 트럭의 진입 시간의 차가 bridge_length와 동일해야 한다.

 

while문을 이용하여 반복 수행하되, 대기 트럭이 모두 다리에 진입할 때(index < truck_weights.length)까지 수행한다.

대기 트럭이 모두 다리에 진입하게 되면 마지막 트럭만 빠져나오는 시간만 고려하면 되기 때문에 현재 시간(time)에 bridge_length를 더해준다.

 

코드

import java.util.LinkedList;
import java.util.Queue;

public class Solution {
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        int answer = 0;

        Queue<Truck> bridge = new LinkedList<>();
        int currentWeight = 0;
        int index = 0 ;
        int time = 0;
        
        while (index < truck_weights.length) {
            time++;
            
            if (!bridge.isEmpty() && time - bridge.peek().time == bridge_length) {
                Truck truck = bridge.poll();
                currentWeight -= truck.weight;
            }

            if (bridge.size() >= bridge_length) {
                continue;
            }
            
            if (currentWeight + truck_weights[index] > weight) {
                continue;
            }
            
            currentWeight += truck_weights[index];
            bridge.add(new Truck(truck_weights[index], time));
            
            index++;
        }
        
        return time + bridge_length;
    }
    
    class Truck {
        int weight;
        int time;

        public Truck(int weight, int time) {
            this.weight = weight;
            this.time = time;
        }
    }
}

 

반응형