본문 바로가기
알고리즘

[알고리즘] 다리를 지나는 트럭

by keel_im 2020. 11. 4.
반응형

포인트

  • 다리를 지나는 트럭 구조체를 만들어서 다리라는 큐를 만들고 큐를 돌면서 진행을 하면 된다.
  • 구조체를 잘 만들면 의미 분석하기 편하다.

🧶문서는 항상 수정 될 수 있습니다. 비판은 환영합니다. 

c++/cpp

#include <vector>
#include <queue>
using namespace std;

struct Car { //차로 구조체를 만들기
    int weight, length;
};

int solution (int bridge_length, int weight, vector<int> truck_weights) {
    int answer=0;
    queue<Car> bridge; //weight , length
    int currentWeight=0;

    while(1) {
        int size=bridge.size ();
        for(int i=0;i<size; i++) {
            auto first_car=bridge.front ();
            bridge.pop ();

            if(first_car.length<=1) {
                currentWeight-=first_car.weight;
                continue;
            }
            bridge.push ({ first_car.weight, first_car.length - 1 });
        }

        if(!truck_weights.empty()&&currentWeight+truck_weights[0]<=weight) {
            bridge.push ({ truck_weights[0], bridge_length });
            currentWeight+=truck_weights[0];
            truck_weights.erase (truck_weights.begin ());
        }

        answer+=1; //답을 1개 늘려준다.
        if (truck_weights.empty()&&bridge.empty()) break; // 종료조건
    }
    
    return answer;
}

python

def solution(bridge_length: int, weight: int, truck_weights: list) -> int:
    time = 0 # 시간 검사
    bridge = [] #브릿지 함수
    weight_monitoring = 0 # weight 모니터링

    while True:
        time += 1 # 시간을 얻자

        size = len(bridge)
        for _ in range(size):
            temp_weight, length = bridge.pop(0)

            if length <= 1:
                weight_monitoring -= temp_weight
                continue
            bridge.append([temp_weight, length-1])

        if truck_weights and weight_monitoring+truck_weights[0] <= weight:
            weight_monitoring += truck_weights[0]
            bridge.append([truck_weights[0], bridge_length])
            truck_weights.pop(0)

        if not truck_weights and not bridge:
            # 기다리는 사람이 없고 카운트가 되지 않으면
            break

    return time

 

반응형

댓글