※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 15804번 문제인 저거 못 타면 지각이야!!이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/15804
15804번: 저거 못 타면 지각이야!!
프로그램의 입력은 표준 입력으로 받는다. 첫줄에는 정류장에 동시에 정차 가능한 버스 수 n, 영우가 타려는 버스까지의 버스 수 m이 주어진다.(1 ≤ n ≤ 10, 1 ≤ m ≤ 100) 다음 m줄에는 각 버스가
www.acmicpc.net
문제에서 주어지는 버스정류장은 큐의 형태로 모델링이 가능하다.
문제 조건에서 주어진 순서를 이용해 각 버스가 들어올 때마다 (1) 나갈 수 있는 버스를 모두 내보내고, (2) 해당 버스가 들어올 빈 자리가 있으면 들여보내고 (3) 자리가 없다면 모든 버스를 내보낼 때까지 기다린 뒤 해당 버스를 정류장에 집어넣는 시뮬레이션을 돌려 문제를 해결하자.
위 시뮬레이션을 돌릴 때, 새로 들어오는 버스의 도착시간은 항상 이전에 들어오는 버스의 도착시간 이상이 되어야 한다는 점을 확인하자.
아래는 제출한 소스코드이다.
#include <iostream>
#include <deque>
using namespace std;
struct bus {
int arrive;
int depart;
int idx;
bus(int arrive, int depart, int idx) {
this->arrive = arrive, this->depart = depart, this->idx = idx;
}
};
int N, M;
deque<bus> dq;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> N >> M;
while (M--) {
int arrive, depart; cin >> arrive >> depart;
while (!dq.empty()) {
if (dq.front().depart <= arrive) dq.pop_front();
else break;
}
if (dq.empty()) dq.push_back(bus(arrive, arrive + depart, 1));
else if (dq.back().idx == N) {
while (!dq.empty()) {
arrive = max(arrive, dq.front().depart);
dq.pop_front();
}
dq.push_back(bus(arrive, arrive + depart, 1));
}
else {
arrive = max(arrive, dq.back().arrive);
dq.push_back(bus(arrive, arrive + depart, dq.back().idx + 1));
}
}
cout << dq.back().idx;
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 15805 // C++] 트리 나라 관광 가이드 (0) | 2022.07.24 |
---|---|
[BOJ 15808 // C++] 주말 여행 계획 (0) | 2022.07.24 |
[BOJ 15803 // C++] PLAYERJINAH’S BOTTLEGROUNDS (0) | 2022.07.22 |
[BOJ 15807 // C++] *빛*영*우* (0) | 2022.07.21 |
[BOJ 1294 // C++] 문자열 장식 (0) | 2022.07.20 |