알고리즘/백준

[백준 13335] 트럭 C++

겜도리도리 2022. 4. 30. 23:43
반응형

문제

백준 13335 트럭 C++

 

13335번: 트럭

입력 데이터는 표준입력을 사용한다. 입력은 두 줄로 이루어진다. 입력의 첫 번째 줄에는 세 개의 정수 n (1 ≤ n ≤ 1,000) , w (1 ≤ w ≤ 100) and L (10 ≤ L ≤ 1,000)이 주어지는데, n은 다리를 건너는 트

www.acmicpc.net

풀이

트럭이 순차적으로 다리를 건너므로(FIFO) 큐를 이용한다.

3단계로 나눠서 풀면 편하다.

다리 위로 안 올라간 트럭들의 Queue와

다리 위에서 움직이고 있는 트럭 Queue

다리 위에서 움직이고 있는 트럭의 거리를 1증가시켜줄 임시 Queue 3개를 선언한다.

 

1단계 - 이미 다리 위에 있는 트럭들을 모두 1칸 앞으로 이동시킨다.

1-1 : 이 때 트럭이 다리를 건넜으면, 다리 queue에서 빼준다.

2단계 - 새 트럭을 올릴 수 있으면 올린다.

2-1 : 트럭을 올렸다면 대기 Queue에서 빼준다.

3단계 - 대기 Queue와 다리 Queue를 검사하여 모두 비었다면 트럭이 전부 건넌 것이므로 루프를 종료

그 후 time을 출력한다.

소스 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include<iostream>
#include<queue>
using namespace std;
 
// 아직 다리 안 올라간 트럭들
queue<int> waitTruckQueue;
// 무게, 간 거리
queue<pair<intint>> goingTruckQueue;
// 임시로 1 더해주는 큐
queue<pair<intint>> tempQueue;
 
 
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
 
    int n;
    int w;
    int L;
 
    cin >> n >> w >> L;
 
    for (int i = 0; i < n; i++)
    {
        int weight;
        cin >> weight;
        waitTruckQueue.push(weight);
    }
 
    int time = 0;
    int weightSumOnBridge = 0;
    while (1)
    {
        time += 1;
        // 1. 다리 위 트럭들 1칸 전진, 도착하면 Pop
        while (goingTruckQueue.empty() == false)
        {
            int weight = goingTruckQueue.front().first;
            int distance = goingTruckQueue.front().second;
            goingTruckQueue.pop();
            tempQueue.push(make_pair(weight, distance));
        }
 
        while (tempQueue.empty() == false)
        {
            int weight = tempQueue.front().first;
            int distance = tempQueue.front().second;
            distance += 1;
            tempQueue.pop();
            if (distance < w)
            {
                goingTruckQueue.push(make_pair(weight, distance));
            }
            else
            {
                weightSumOnBridge -= weight;
            }
        }
        // 2. 대기 트럭 갈 수 있으면 전진 후 큐에 Push
        if (waitTruckQueue.empty() == false)
        {
            int nextTruckWeight = waitTruckQueue.front();
            if (nextTruckWeight + weightSumOnBridge <= L)
            {
                goingTruckQueue.push(make_pair(nextTruckWeight, 0));
                weightSumOnBridge += nextTruckWeight;
                waitTruckQueue.pop();
            }
        }
        // 3. 다 지나갔는지 확인
        if (waitTruckQueue.empty() && goingTruckQueue.empty())
            break;
    }
 
    cout << time;
    return 0;
}
cs
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 1260] DFS와 BFS C++  (0) 2022.05.31
[백준 15654] N과 M (5) C++  (0) 2022.05.02
[백준 2309] 일곱 난쟁이 C++  (0) 2022.03.30
[백준 1065] 한수 C++  (0) 2022.03.29
[백준 10816] 숫자 카드 2  (0) 2022.02.12