입력된 일정들을 겹치지 않게 구성하기 위해 필요한 강의실의 최솟값을 구하는 문제이다.
처음엔 queue로 풀고, 구성하지 못한 경우 뒤로 넘기는 방식을 선택했는데
이렇게 하니 worst case에서 시간복잡도가 O(n^2)가 되어 버린다.
생성된 방들의 일정 중 가장 나중에 끝나는 일정의 시간만 저장하고, 그것들을 비교하면 되는데,
방의 갯수가 늘어나게 될 때 모든 방을 불필요하게 비교하지 않아도
Priority queue로 구성하게 되면, 가장 일찍 끝나는 방의 경우만 살피면 되기 때문에 시간 복잡도를 n에서 logn으로 줄일 수 있게 된다.
고로 priority-queue엔 가장 늦게 끝나는 스케줄의 끝나는 시간만 넣어놓으면 된다.
#include <iostream>
#include <algorithm>
#include <utility>
#include <vector>
#include <queue>
int A, B, C, N, d1, d2, res, length;
int lecture_start, lecture_end;
using namespace std;
vector<pair<int, int>> allPair;
priority_queue<int, vector<int>, greater<int>> pq;
int main(){
scanf("%d", &N);
for(int i = 0; i < N; i++){
scanf("%d %d", &d1, &d2);
allPair.emplace_back(make_pair(d1, d2));
}
sort(allPair.begin(), allPair.end());
pq.push(allPair[0].second); // 첫번째가 끝나는 마지막꺼
for(int i = 1 ; i < N ; i++){
lecture_start = allPair[i].first;
lecture_end = allPair[i].second;
if(pq.top() > lecture_start){
// 시간대가 겹치면
pq.push(lecture_end); // lecture가 더 필요하니 넣어라.
}
else { // 안겹치면
pq.pop(); // 지금있는거 빼고
pq.push(lecture_end); // 새로운 end를 넣어라.
}
}
printf("%d", pq.size());
return 0;
}
'백준 > 카테고리별' 카테고리의 다른 글
[BOJ] 단계별로 풀어보기 - 우선순위 큐 (0) | 2020.07.06 |
---|---|
[BOJ] 2094 수학은 너무 쉬워 (0) | 2020.04.24 |
[BOJ] 7579 앱 (0) | 2020.04.16 |
[BOJ] 11562 백양로 브레이크 (0) | 2020.04.14 |
[BOJ] 2473 세 용액 (0) | 2020.04.11 |
댓글