본문 바로가기

알고리즘/보여주기식 문제풀기

programmers/다리를 지나는 트럭/c++

문제

 

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

트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 트럭은 1초에 1만큼 움직이며, 다리 길이

programmers.co.kr


이 문제의 핵심은 출발 시간입니다.

'마지막 트럭의 출발시간 + (bridge_length / 1)'이 모든 트럭이 도착한 시간이 된다는 것을 빠르게 알아차리는게 중요합니다.

아래는 그것의 구현입니다.

더보기
#include <string>
#include <vector>
#include <queue>

using namespace std;

int solution(int bridge_length, int weight, vector<int> truck_weights) {
    int answer = 0;
    
    queue<int> onBridgeTruck; // 다리 위 트럭의 무게들입니다.
    queue<int> truckStartT; // 트럭이 다리에 진입한 시간입니다.
    
    int startTime = 0; // 출발시간입니다.
    int sumWeight = 0; // 다리 위 트럭 무게의 합입니다.
    int culTruckIndex = 0;
    
    // 마지막 트럭이 출발하면 탈출합니다.
    while(culTruckIndex < truck_weights.size()) {
        startTime += 1;
        
        // 트럭이 도착한 경우 트럭을 빼줍니다.
        int frontTruckStart = truckStartT.front();
        if(startTime - frontTruckStart == bridge_length) {
            sumWeight -= onBridgeTruck.front();
            onBridgeTruck.pop();
            truckStartT.pop();
        }
        
        // 다리 위의 트럭 무게와 후보 트럭 무게가 동일하다면, 다리에 올려줍니다.
        int culTruckWeight = truck_weights[culTruckIndex];
        if(sumWeight + culTruckWeight <= weight) {
            onBridgeTruck.push(culTruckWeight);
            truckStartT.push(startTime);
            culTruckIndex += 1;
            sumWeight += culTruckWeight;
        }
    }
    
    // 마지막 트럭 출발 시간과 (다리 길이 / 속력)은 모든 트럭이 이동을 완료한 시간입니다.
    answer = startTime + bridge_length;
    
    return answer;
}

'알고리즘 > 보여주기식 문제풀기' 카테고리의 다른 글

1300 - K번째 수  (0) 2020.04.14