Algorithm/프로그래머스

[프로그래머스] 다리를 지나는 트럭(C++) level2

Henu 2022. 1. 27. 01:14

Queue를 사용하는 문제이다.

문제에서 주어진 대로 트럭이 다리를 지나가는 과정을 구현하면 된다.

 

현재 차례의 트럭이 다리의 최대 무게 때문에 못 지나가는 경우, 무게가 0인 트럭을 지나가게 하도록 대체 할 수 있다.

 

 

핵심 while 문 내부 코드 분석

if(weightSum + now_weight <= weight){
    weightSum += now_weight;
    que.push(now_weight);
    i++;
}
else que.push(0);

time++;

while문 내의 가장 아랫부분에 있는 코드이다.

이 부분을 제일 먼저 만들었다.

현재 다리에 있는 트럭 무게의 합과 현재 차례의 트럭 무게의 합이 허용 무게 이하라면,

무게의 합을 갱신하고,

queue에 트럭을 push하고, 

트럭의 차례를 넘겨준다(i++)

1번 반복할 때마다 반드시 1초의 시간이 흐른다.

 

 

if(que.size() == bridge_length){
    weightSum -= que.front();
    que.pop();
}

현재 다리에 실제 트럭을 넣을 지, 무게가 0인 트럭을 넣을 지 고민하기 전에

현재 다리가 꽉 차있는지 확인해야한다.

만약 다리가 가득차있다면 가장 앞에있는 트럭 하나를 방출시킨다.

 

 

if(i == truck_weights.size()){
    time += bridge_length;
    break;
}

마지막 트럭까지 다리에 올렸다면 이제 종료해야한다.

마지막 트럭이 다리의 첫 번째 위치에 있을 것이기 때문에 마지막 트럭이 빠져나가기 위해서 다리의 길이만큼의 시간이 필요하다.

다리 길이만큼 시간을 더해주고 while문을 빠져나간다.

 

 

최종 코드

#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> que;
    
    int weightSum = 0;
    
    int i = 0;
    while(true){
    	int now_weight = truck_weights[i];
        if(i == truck_weights.size()){
            time += bridge_length;
            break;
        }
        
        
        if(que.size() == bridge_length){
            weightSum -= que.front();
            que.pop();
        }
        
        if(weightSum + now_weight <= weight){
            weightSum += now_weight;
            que.push(now_weight);
            i++;
        }
        else que.push(0);
        
        time++;
    }
    return time;
}

 

 

 

 

 

 

Hola