말랑말랑한 개발자 이야기

[백준 11000번] 강의실 배정 본문

알고리즘/백준

[백준 11000번] 강의실 배정

말랑너구리 2021. 1. 6. 22:51

[백준 11000번] 강의실 배정

www.acmicpc.net/problem/11000

 

11000번: 강의실 배정

첫 번째 줄에 N이 주어진다. (1 ≤ N ≤ 200,000) 이후 N개의 줄에 Si, Ti가 주어진다. (1 ≤ Si < Ti ≤ 109)

www.acmicpc.net

 

 

 문제

 수강신청의 마스터 김종혜 선생님에게 새로운 과제가 주어졌다.

 김종혜 선생님한테는 Si에 시작해서 Ti에 끝나는 N개의 수업이 주어지는데, 최소의 강의실을 사용해서 모든 수업을 가능하게 해야 한다. 

 참고로, 수업이 끝난 직후에 다음 수업을 시작할 수 있다. (즉, Ti ≤ Sj 일 경우 i 수업과 j 수업은 같이 들을 수 있다.)

수강신청 대충한 게 찔리면, 선생님을 도와드리자!

 

 입력

 첫 번째 줄에 N이 주어진다. (1 ≤ N ≤ 200,000)

 이후 N개의 줄에 Si, Ti가 주어진다. (1 ≤ Si < Ti ≤ 109)

 

 출력

 강의실의 개수를 출력하라.

 

 

 풀이

#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	
	int N;
	vector<pair<int, int>> v;
	priority_queue<pair<int,int>, vector<pair<int, int>>, greater<pair<int, int>>> temp;
	
	cin >> N;
	for(int i=0;i<N;i++){
		int s, t;
		cin >> s >> t;
		v.push_back(make_pair(s, t));
	}
	sort(v.begin(), v.end());
	temp.push(make_pair(v[0].second, v[1].first));
	
	for(int i=1;i<v.size();i++){
		if(temp.top().first > v[i].first) temp.push(make_pair(v[i].second, v[i].first));
		else{
			temp.pop();
			temp.push(make_pair(v[i].second, v[i].first));
		}
	}
	

	cout << temp.size();
	
	return 0;
}

 1. 수업의 시작 시간을 기준으로 오름차순 정렬시킨다.

 2. 우선순위 큐는 수업의 끝 시간을 기준으로 오름차순 정렬되도록 한다.

 3. 우선순위 큐의 top은 가장 빨리 끝나는 수업이고 그 끝나는 시간과 비교해서 강의실이 하나 더 필요한 경우에는 push를, 그 수업이 끝나고 연달아서 가능한 경우에는 pop후 push한다.

 

 방법은 바로 떠올랐지만 실수가 많았던 문제이다. 더 많은 문제를 풀어볼 필요가 있어 보인다.