BOJ 1931 회의실 배정

문제링크 : https://www.acmicpc.net/problem/1931

BOJ_1931

요약

한개의 회의실이 있다. N개의 회의의 시작시간과 끝시간이 주어져 있을때, 회의가 겹치지 않게 회의실을 사용할수 있는 회의의 최대 갯수를 구하는 문제.

풀이

예제 값을 한번 그림으로 나타내보았다.

BOJ_1931-2

시작점을 기준으로 정렬해준다.

BOJ_1931-3

맨앞에 막대(회의시간)를 현재값으로 두고 순서대로 탐색하면서 현재의 막대의 끝점과 같은 시작점이 나오면 카운트해준다. 탐색중에 현재 막대의 끝점보다 더 빠른 끝점을 가진 막대가 나오면 현재 막대로 그것을 바꿔준다. 끝까지 탐색이 끝나면 카운트한 값을 출력해준다.

코드

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<pair<int, int>>q;
pair<int, int>now;
int n,s,e,cnt=1;
int main() {
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> s >> e;
		q.push_back({ s,e });
	}
	sort(q.begin(), q.end());
	now = q[0];
	for (int i = 1; i < q.size(); i++) {
		if (now.second > q[i].second)
			now = q[i];
		else if (now.second <= q[i].first) {
			now = q[i];
			cnt++;
		}
	}
	cout << cnt << "\n";
}

Comments