Problem Solving/Baekjoon Online Judge

BOJ/백준 13335 트럭

khj1999 2024. 9. 10. 20:02

https://www.acmicpc.net/problem/13335

 

해결 아이디어

일단 트럭시 순차적으로 진행 한다는 것을 확인 했으니 큐를 사용해서 문제를 해결하면 될것으로 판단 했고

다리 상태를 체크할 수 있는 Vector를 만들어서 검사 하는 식으로 문제를 해결 했다.

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

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    int n, w, l;
    queue<int> q;
    // pair의 first는 트럭의 무게 second는 현재 남은 거리
    vector<pair<int, int>> bridge;
    cin >> n >> w >> l;
    
    for (int i = 0; i < n; i++) {
        int tmp; 
        cin >> tmp;
        q.push(tmp);
    }

    int ans = 0;

    // 무게 체크
    auto check = [](const vector<pair<int, int>> v) {
        int sum = 0;
        for (const auto element : v) {
            sum += element.first;
        }
        return sum;
    };

    // 반복마다 시간 감소
    auto calc = [](vector<pair<int, int>>& v) {
        for (auto& element : v) {
            element.second--;
        }
    };

    while (!q.empty() || !bridge.empty()) {
        ans++;
        calc(bridge);

        // 지나간 트럭은 다리에서 제거
        bridge.erase(remove_if(bridge.begin(), bridge.end(), [](pair<int, int> n) {
            return n.second == 0;
        }), bridge.end());

        // 다리에 트럭 추가
        if (!q.empty() && (bridge.size() < w) && (check(bridge) + q.front() <= l)) {
            bridge.push_back({q.front(), w});
            q.pop();
        }
    }

    cout << ans;
    return 0;
}

경험? 깨닫은것?

처음에 코드를 작성할때 vector<pair<int, int>> 이것을 작성하기 싫어서 매개변수에 전부 auto키워드를 사용했는데

이렇게 하니 로컬에서 segmentation fault 자꾸 나서 수정 해주니 바로 해결되었다 auto 키워드를 사용 하는 것을

조금 지양하고 명확히 선언 해줘야 할 것 같다.