본문 바로가기

Archived(CSE Programming)/알고리즘(C++)

프로그래머스_다리를 지나는 트럭

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

 

코딩테스트 연습 - 다리를 지나는 트럭 | 프로그래머스

트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 트럭은 1초에 1만큼 움직이며, 다리 길이는 bridge_length이고 다리는 무게 weight까지 견딥니다. ※ 트럭이 다리에 완전히 오르지 않은 경우, 이 트럭의 무게는 고려하지 않습니다. 예를 들어, 길이가 2이고 10kg 무게를 견디는 다리가 있습니다. 무게가 [7, 4, 5, 6]kg인 트럭이 순서

programmers.co.kr

스택/큐, LV2

해당 문제는 queue를 통해 트럭을 하나씩 순서대로 가져와서 푸는 문제였다.

다리 자체도 queue를 통해 구성할 수는 있으나 vector를 통해 푸는 것이 보다 쉬울 것 같아서 vector로 접근하여 풀었다. 다리의 무게를 주의하면서 다리를 건너게 하면 된다. 문제가 주어진 상황을 그대로 시뮬레이션하면 쉽게 해결 가능한 문제였다.

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

int solution(int bl, int weight, vector<int> truck_weights) {
    int answer = 0, bw = 0;
    queue<int> tw;
    for(int i =0 ; i <truck_weights.size(); i++)
        tw.push(truck_weights[i]);
    vector<pair<int,int>> bv;
    
    // 반복
    while(true){
        // 트럭을 다리에 다 올리고 다리에 남은 것 이 없을 때
        if(bv.size() == 0 && tw.size() == 0){
            break;
        }
        
        // 트럭들 다리에서 한칸 이동
        for(int i=0;i<bv.size();i++)
            bv[i].second++;
        
        // 다 건넌 것 제외
        if(bv.size() >=1 && bv[0].second == bl){
            bw -= bv[0].first;
            bv.erase(bv.begin());
        }
        
        // 올릴 수 있음 올리기
        if(tw.size()>=1 && bw + tw.front() <= weight) {
            bv.push_back(pair<int,int>(tw.front(), 0)); // 올리기
            bw += tw.front(); // 다리 무게 증가
            tw.pop(); // 하나 빼기    
        }
        
        // 시간 초 증가
        answer++;
    }
    
    return answer;
}

'Archived(CSE Programming) > 알고리즘(C++)' 카테고리의 다른 글

프로그래머스 더 맵게  (0) 2019.11.29
프로그래머스_기능개발  (0) 2019.11.23
프로그래머스_탑  (0) 2019.11.20
프로그래머스_라면 공장  (0) 2019.11.20
프로그래머스_H-Index  (0) 2019.11.19