[프로그래머스] 다리를 지나는 트럭 (Lv.2)
문제 링크
문제 설명
길이 bridge_length, 최대 하중 weight인 다리가 있다.
트럭 무게 배열 truck_weights가 주어질 때, 모든 트럭이 다리를 건너는 최소 시간을 반환하라.
- 다리는 한 번에
bridge_length개의 트럭만 올라갈 수 있음 - 다리 위 트럭 무게 합이
weight를 초과하면 올라갈 수 없음 - 매 초마다 다리 위 트럭은 1칸 전진, 다리 끝에 도달하면 빠져나감
예) bridge_length=2, weight=10, truck_weights=[7,4,5,6] → 8
내 풀이
다리를 bridge_length 크기의 큐로 표현하고 초기값 0으로 채운다.
매 초마다 큐 앞에서 꺼내고(다리를 건넌 트럭), 뒤에 새 트럭 또는 0(빈 자리)을 넣는다.
current_weight로 다리 위 총 무게를 추적하고, idx로 다음에 올릴 트럭을 추적한다.
모든 트럭을 다 올렸고 다리가 빌 때까지 반복한다.
#include <string>
#include <vector>
#include <queue>
using namespace std;
int solution(int bridge_length, int weight, vector<int> truck_weights) {
int time = 0;
queue<int> bridge;
for(int i = 0; i < bridge_length; i++) bridge.push(0);
int current_weight = 0;
int idx = 0;
while(idx < truck_weights.size() || current_weight > 0)
{
time++;
current_weight -= bridge.front();
bridge.pop();
if(idx < truck_weights.size() && current_weight + truck_weights[idx] <= weight)
{
bridge.push(truck_weights[idx]);
current_weight += truck_weights[idx];
idx++;
}
else
{
bridge.push(0);
}
}
return time;
}
시간복잡도 분석
while 루프는 최악의 경우 모든 트럭이 한 대씩만 올라갈 수 있을 때 O(n × bridge_length).
n ≤ 10,000, bridge_length ≤ 10,000이므로 최악 O(10⁸) → 프로그래머스 기준 통과 가능하다.
오답노트
처음에 truck_on_bridge 카운터 방식으로 접근했는데, 각 트럭이 다리를 얼마나 건넜는지 추적할 수 없어서 로직이 틀렸다.
다리를 큐로 표현하는 발상으로 바꾼 후에도 두 가지 실수가 있었다.
- 조건에서
bridge.front()를 새 트럭 무게로 착각 →truck_weights[idx]를 써야 함 bridge.back() == 0조건을 불필요하게 추가 → 무게 조건만으로 충분
후기
진짜 많은 시행착오 끝에 문제의 해결법에 도달했다. 아무래도 조금 더 기초가 필요할 듯 하다.