기술 블로그

13335번 트럭 본문

알고리즘 문제/BOJ

13335번 트럭

parkit 2022. 5. 4. 15:45
728x90
반응형

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

 

처음에는 Greedy 문제인줄 알았다.

 

로직 순서 호출만 조심하면 되고, 나머지는 구현이다.

 

1. 한 칸 씩 이동 → 트럭 제거 → 새로운 트럭 추가 순서로 호출

2. 무게 총 합에서 제거한 트럭의 무게를 뺄 때, v.erase(itr)를 나중에 해준다. 먼저하면, itr이 자동 증가하기 때문에 그 다음 원소(트럭)의 무게가 빼진다.

3. 새로운 트럭을 추가할 때, index와 현재 다리에 올라가 있는 트럭들의 무게 총합(total_weight)를 올라갈 트럭의 무게까지 고려하여 if 조건문을 잘 따진다.

 

#include <bits/stdc++.h>

using namespace std;

#define MAX 1010
// https://www.acmicpc.net/problem/13335
int a[MAX];
int n, w, L;

/*
* w : 다리 길이
* L : 다리의 최대 하중
*/
int simulation() {
    int t = 0;
    
    vector<pair<int, int> > bridge; // 다리
    int total_weight = 0; // 다리에 올라가있는 트럭들의 무게 총 합
    int index = 0; // 현재 트럭의 순서(인덱스)

    while (true)
    {
        // 한 칸 이동
        if (!bridge.empty()) {
            for (auto& i : bridge) {
                i.second += 1;
            }
        }

        // 다리 지나간 트럭 제거(새로운 트럭을 추가하는 로직보다 먼저 와야한다.)
        // 그래야, bridge.empty()라면, break 할 수 있다.
        while (!bridge.empty())
        {
            auto itr = bridge.begin();
            if (itr->second == w) {
                total_weight -= itr->first; // 무게 총합에서 뺀다. ★순서주의 : 계산부터 먼저 한 후, erase 해야함.
                bridge.erase(itr); // 다리에 올라가 있는 맨 앞 트럭 제거
            }
            else {
                break;
            }
        }

        // 새로운 트럭 추가
        if (index < n && bridge.size() + 1 <= w && total_weight + a[index] <= L) {
            bridge.push_back({ a[index], 0 });
            total_weight += a[index++];
        }

        // 시간 경과
        ++t;

        // 탈출
        if (bridge.empty()) {
            break;
        }
    }

    return t;
}

int main()
{
    cin.tie(0);

    scanf("%d %d %d", &n, &w, &L);
   
    for (int i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }

    printf("%d\n", simulation());

    return 0;
}

 

 

 

 

728x90
반응형

'알고리즘 문제 > BOJ' 카테고리의 다른 글

16932번 모양 만들기  (0) 2023.05.01
17472번 다리 만들기 2  (0) 2022.07.17
18430번 무기 공학  (0) 2022.05.04
2138번 전구와 스위치  (0) 2022.05.03
17471번 게리맨더링  (0) 2022.04.27