728x90
문제 링크: https://www.acmicpc.net/problem/13335
큐를 이용해서 시뮬레이션을 구현하는 문제로 특별한 알고리즘은 없는 문제다.
다만 이런 시뮬레이션 문제를 처음 풀어보았기 때문에 어버버하다가 시간이 좀 걸렸다.
큐를 이용해야 겠다는 아이디어를 떠올린 이유는 트럭이 대기중인 '순서대로' 다리를 통과해야 되기 때문이다.
그렇기 때문에 순서를 지키면서 트럭을 이동시키기 위해서 queue를 활용해 문제를 풀어야겠다는 아이디어를 생각했다.
트럭이 대기중인 큐, 다리위에서 이동중인 트럭이 담긴 큐 2개를 만들면 된다.
주의할 점이 이 문제에서는 2가지가 있었는데,
1. 35번째 줄에 if (sum + front_truck <= weight) --> 다리와 무게가 똑같아도 트럭이 움직일 수 있다.
<=를 <로 풀면 문제가 전혀 달라짐.
2. 25, 33번째 줄에 if(moving_trucks.size()>0) , if(waiting_trucks.size()>0)
는 반드시 넣을 것.
저것을 안넣을 시 밑에 줄에서 빈 큐의 front() 값을 참조하게 되어 런타임 에러가 발생하게 된다.
주의해서 코딩할 것!
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
|
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int answer=0;
int main(void){
int n,length,weight,t;
cin>>n>>length>>weight;
int answer=0;
queue<int> waiting_trucks;
queue<pair<int,int>> moving_trucks;
vector<int> arrived_trucks;
int sum=0;
for(int i=0;i<n;i++) {
cin >> t;
}
while(arrived_trucks.size()<n){
answer++;
int front_truck=0;
if(moving_trucks.size()>0) {
if (moving_trucks.front().second == answer) {
int z = moving_trucks.front().first;
arrived_trucks.push_back(z);
sum -= z;
moving_trucks.pop();
}
}
if(waiting_trucks.size()>0) {
front_truck = waiting_trucks.front();
if (sum + front_truck <= weight) {
sum += front_truck;
waiting_trucks.pop();
}
}
}
cout<<answer;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
'알고리즘 > 백준' 카테고리의 다른 글
백준 16194 카드구매하기 2 - 쉬운 dp문제 c++ (0) | 2020.03.08 |
---|---|
백준 17779 - 게리맨더링2 - 시뮬레이션 (c++) (0) | 2020.03.04 |
백준 1261 알고스팟: bfs와 caching 쓰는 문제 c++ (0) | 2020.02.23 |
백준 2143 두 배열의 합 - 단순 브루트포스 c++ (0) | 2020.02.18 |
투 포인터 알고리즘, 슬라이딩 알고리즘 (0) | 2020.02.13 |