코딩 테스트 준비/문제

6. 프로그래머스 - 다리를 지나는 트럭(큐)

masxer 2025. 7. 8. 13:33

문제 설명: 다리를 지나는 트럭

 

트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순서대로 지나가려고 합니다.
이때 다리는 다음과 같은 제약 조건을 가집니다:

  • 동시에 올라갈 수 있는 트럭 수는 최대 bridge_length대입니다.
  • 동시에 버틸 수 있는 최대 무게는 weight입니다.
  • 트럭은 1초에 한 칸씩 전진하며, 다리를 완전히 지나기 위해서는 bridge_length초가 걸립니다.
  • 다리에 완전히 오르지 않은 트럭의 무게는 무시합니다.

트럭들은 주어진 순서대로만 다리를 건널 수 있습니다.
모든 트럭이 다리를 건너는 데 최소 몇 초가 걸리는지 구하세요.

 

입력 형식

다음 세 개의 인자가 함수의 매개변수로 주어집니다.

int bridge_length // 다리의 길이 (다리 위에 동시에 올라갈 수 있는 최대 트럭 수)
int weight // 다리가 견딜 수 있는 최대 무게
int[] truck_weights // 트럭들의 무게 배열 (순서대로 다리를 건넘)
 
 

제한 조건

  • 1 ≤ bridge_length ≤ 10,000
  • 1 ≤ weight ≤ 10,000
  • 1 ≤ truck_weights.length ≤ 10,000
  • 각 트럭의 무게는 1 이상 weight 이하입니다.

 

출력 형식

모든 트럭이 다리를 건너는 데 걸리는 최소 시간(초)을 반환합니다.

int result // 최소 시간 (초)
 
 
입출력 예시
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
다리 길이: 2, 최대 하중: 10
트럭 무게: [7, 4, 5, 6]

시뮬레이션:

시간다리를 지난 트럭다리 위 트럭대기 중 트럭
0 [] [] [7, 4, 5, 6]
1 [] [7] [4, 5, 6]
2 [] [7, 0] [4, 5, 6]
3 [7] [4] [5, 6]
4 [7] [4, 5] [6]
5 [7, 4] [5, 0] [6]
6 [7, 4, 5] [6] []
7 [7, 4, 5] [6, 0] []
8 [7, 4, 5, 6] [] []
 

알고리즘 코드

import java.util.Queue;
import java.util.ArrayDeque;

class Solution {
    public int solution(int bridge_length, int weight, int[] truck_weights) {
        Queue<Integer> bridge = new ArrayDeque<>();
        
        int sumWeight = 0;
        int time = 0;
        
        for(int truckWeight : truck_weights) {
            while(true) {
                if(bridge.isEmpty()) { // 다리가 빈 경우
                    bridge.add(truckWeight);
                    sumWeight += truckWeight;
                    time++;
                    break;
                }else if(bridge.size() == bridge_length) { 
                // 다리에 올라와 있는 트럭의 개수와 다리에 있는 트럭 개수가 같은 경우
                // 이미 다리 끝에 있는 트럭이 존재하므로 빼주면 됨
                    sumWeight -= bridge.poll();        
                }else { // 다리에 트럭이 하나라도 올라와 있는 경우
                    if(sumWeight + truckWeight <= weight) { // 다리에 있는 트럭의 합과
                    // 이제 다리를 지나려는 트럭의 합이 다리가 견딜 수 있는 무게보다 작거나 같은 경우
                        bridge.add(truckWeight);
                        sumWeight += truckWeight;
                        time++;
                        break;
                    }else { // 아닌 경우 0을 추가해서 앞으로 한 칸씩 트럭을 이동
                        bridge.add(0);
                        time++;
                    }
                }
            }
        }
        return time +  bridge_length; // 마지막 트럭이 건너는 시간까지 고려
    }
}

 

시간 복잡도 분석

다리 위 상태를 저장하는 bridge_length의 최대 길이 이므로 O(N)이다.