알고리즘/프로그래머스

프로그래머스 : 다리를 지나는 트럭 - C++

맏리믓 2023. 7. 10. 12:46

문제

https://school.programmers.co.kr/learn/courses/30/lessons/42583

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


문제 해석

- 트럭의 길이는 1, 즉 다리의 길이 만큼 트럭이 올라 갈 수 있다.

- 또한 다리가 버틸 수 있는 무게 weight 가 주어 지고 이 무게 이상 트럭이 올라 가지못한다.

- 이때 주어진 트럭이 순서대로 이동 할 때 모든 트럭이 다리를 건너기 위해 소모되는 시간을 구하면 된다.


문제 풀이

- FIFO 인 큐를 통해 다리에 진입 한 트럭을 관리 하고 다리 위의 트럭수와 무게를 다리 길이와 제한 무게와 비교해 트럭을 더 진입 시킬지 진입 시키지 않고 기다릴지 결정함

 - 트럭 배열을 처음부터 끝까지 돌며 다음 조건에 따라 queue 에 add, pop 한다.

            . queue가 비었다면 다리가 빈 상태 이기 때문에 add 를 수행 한 후 무게를 더해준 다음 다음 트럭으로 넘어감

            . queue의 size 가 다리의 길이와 같아진다면 다리가 꽉찼기 때문에 트럭을 한대 빼 준후 무게에서 해당 트럭의 무게를 빼줌

            . 위 두 조건 모두 만족하지 않는다면 다리의 길이에 여유가 있기 때문에 무게를 비교하여 queue 에 add, pop 여부를 결정


코드

#include <string>
#include <vector>
#include <queue>

using namespace std;

int solution(int bridge_length, int weight, vector<int> truck_weights) {
    int answer = 0;
    int cur_weight = 0;
    queue<int> q;

    for(auto truck : truck_weights){
        while(true){
            if(q.empty()){
                q.push(truck);
                cur_weight += truck;
                answer += 1;
                break;
            } else if(q.size() == bridge_length){
                cur_weight -= q.front();
                q.pop();
            } else {
                if(cur_weight + truck <= weight){
                    q.push(truck);
                    cur_weight += truck;
                    answer += 1;
                    break;                    
                } else {
                    q.push(0);
                    answer += 1;
                }
            }
        }
    }
    answer += bridge_length;
    return answer;
}