https://www.acmicpc.net/problem/13335
13335번: 트럭
입력 데이터는 표준입력을 사용한다. 입력은 두 줄로 이루어진다. 입력의 첫 번째 줄에는 세 개의 정수 n (1 ≤ n ≤ 1,000) , w (1 ≤ w ≤ 100) and L (10 ≤ L ≤ 1,000)이 주어지는데, n은 다리를 건너는 트
www.acmicpc.net
트럭 문제는 큐와 덱을 이용해서 해결할 수 있습니다.
알고리즘의 기본 틀은 아래와 같습니다.
- 기다리는 트럭을 모두
Queue1에 넣는다. - 다리 위에 있는 트럭들을 모두 앞으로 1씩 이동시킨다.
- 다리를 건넌 트럭은, 다리 위의 트럭을 저장하는
Queue2에서 pop() 한다. Queue1에서 가장 앞에 있는 트럭을 pop()하여Queue2에 push()한다.
(단, 다리 위에 트럭 W대가 있거나 최대 하중을 넘는 경우 트럭을 올리지 않는다.)- 다시 2번 과정부터 진행한다. (단, Queue1과 Queue2에 트럭이 남아있지 않다면 종료한다.)
아래는 전체 코드입니다. Queue2는 다리 위에 있는 트럭들의 무게를 계산하기 위해 편의를 위해 덱을 사용하였습니다.
#include <bits/stdc++.h>
using namespace std;
#define w first
#define p second
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
int n, w, l;
cin >> n >> w >> l;
queue<int> truck; // 다리 위에 올라가지 못한 트럭을 저장하는 queue
for(int i = 0; i < n; i++){ // 각 트럭의 무게 입력 받음
int w; cin >> w;
truck.push(w);
}
deque<pair<int, int>> bridge; // 다리 위에 있는 트럭을 저장하는 queue
int time = 0; // 트럭들이 다리를 건너는 최단 시간
while(!truck.empty() || !bridge.empty()){ // 모두 다리를 건널 때까지 진행
for(int i = 0; i < bridge.size(); i++) bridge[i].p -= 1; // 다리 위 트럭 앞으로 1씩 이동
if(!bridge.empty() && bridge.front().p == 0) // 다리를 건넌 트럭은 bridge 큐에서 pop
bridge.pop_front();
int weight = 0;
for(auto truck : bridge) weight += truck.w ; // 다리 위에 있는 전체 트럭의 무게 계산
if(!truck.empty() && truck.front() + weight <= l
&& bridge.size() < w){ // 다리 위에 트럭이 올라갈 자리가 있고, 다리의 최대 하중이 남은 경우
bridge.push_back({truck.front(), w});
truck.pop();
}
time++;
}
cout << time;
}'Algorithm > Simulation' 카테고리의 다른 글
| [백준 11559번] Puyo Puyo (C/C++) (0) | 2022.03.17 |
|---|---|
| [백준 15686번] 치킨 배달 (C/C++) (0) | 2022.03.17 |
| [백준 12100번] 2048 (easy) (C/C++) (0) | 2022.03.17 |
| [백준 18808번] 스티커 붙이기 (C/C++) (0) | 2022.03.16 |
| [백준 14888번] 연산자 끼워넣기 (C/C++) (0) | 2022.03.16 |