문제 : 백준 11000 강의실 배정 👩🏫
난이도 : 골드 5
1️⃣ Si(= 수업 시작시간)에 시작해서 Ti(= 수업 종료시간)에 끝나는 N개의 수업이 주어진다.
2️⃣ 최소의 강의실을 사용해서 모든 수업을 가능하게 해야 한다.
3️⃣ 수업이 끝난 직후에 다음 수업을 시작할 수 있다.
(Ti <= Sj일 경우, i 수업과 j 수업은 같이 들을 수 있다.)
참고 자료 1 : 탐욕 알고리즘
참고 자료 2 : 백준 1100번 "강의실 배정" 풀이
이 문제의 핵심은 '첫번째 강의가 최대한 일찍 끝나야 한다."는 점이다.
따라서, 이를 위해서 각각의 강의 종료시간을 작은 순서대로 정렬해주며, 가장 먼저 일찍 끝나는 첫번째 강의를 pop할 수 있는 priority_queue를 사용해야 한다.
1. 강의 시작 시간과 종료시간을 입력받는다.
while(N--){
cin>>S>>T;
timeTable.push_back({S,T});
}
2. 강의 시작 시간이 작은 순서대로 정렬한다.
sort(timeTable.begin(), timeTable.end());
3. 강의 종료시간을 priority_queue에 넣어준다.
priority_queue<int, vector<int>, greater<int>> pq;
pq.push(timeTable[0].second); //강의 종료시간을 넣는다.
for(int i=1; i<timeTable.size(); i++){
pq.push(timeTable[i].second);
...
}
if(pq.top()<=timeTable[i].first){
pq.pop();
}
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int N = 0;
int S =0, T = 0; //시작시간, 종료시간
vector<pair<int,int>> timeTable;
cin>>N;
while(N--){
cin>>S>>T;
timeTable.push_back({S,T});
}
//시작시간 순서대로 정렬한다.
sort(timeTable.begin(), timeTable.end());
priority_queue<int, vector<int>, greater<int>> pq;
pq.push(timeTable[0].second);
for(int i=1; i<timeTable.size(); i++){
pq.push(timeTable[i].second);
if(pq.top()<=timeTable[i].first){
pq.pop();
}
}
cout<<pq.size()<<"\n";
}