Hello World!

[BOJ] 1931번: 회의실 배정 본문

알고리즘/baekjoon

[BOJ] 1931번: 회의실 배정

qkrgusdk 2020. 3. 29. 22:08

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

 

1931번: 회의실배정

(1,4), (5,7), (8,11), (12,14) 를 이용할 수 있다.

www.acmicpc.net

 

 비슷한 문제를 학교 과제로 풀게 되었는데 처음에는 회의가 시작하는 시간을 우선순위로 두고 정렬해서 이중 for문으로 풀려 했기 때문에 당연히 TLE가 떴다.

 

결국 이 문제는 나 혼자 힘으로 풀지 못하고 회의가 끝나는 시간을 오름차순으로 정렬해야 한다는 힌트를 보고 서야 풀 수 있었다. vector에 pair<int,int>를 넣고 algorithm 헤더에 sort 함수를 이용해서 정렬하면 자동으로 first값을 우선으로 정렬하고, 만약 first값이 같을 경우 second값을 기준으로 정렬을 해주니 아주 편했다.

 

첫번째 회의가 끝나고 다음에 올 수 있는 회의는 시작 시간이 그 전 회의의 끝나는 시간보다 같거나 그 후여야 함을 알면 문제는 끝난다. 설명이 부족한 것 같아 그림을 그렸다.

 

위에 그림은 <1,2><2,7><1,4><5,6><8,9>를 입력받은 경우를 수직선에 나타낸 것이다.

그리고 이를 앞서 한 설명대로 끝나는 시간을 우선으로 정렬하면 아래 표와 같다.

 

END START
2 1
4 1
6 5
7 2
9 8

 

회의가 제일 먼저 끝나는 <1,2>의 경우 회의가 진행될 것이다.

이제 다음 타자를 정해보자.

그 다음 회의는 적어도 앞서 끝난 회의 시간보다 같거나 늦게 시작해야 한다.

또한 정렬이 회의가 일찍 끝나는 순으로 되어 있으므로 앞의 회의가 언제 끝났는지만 고려하면 바로 다음 회의를 정할 수 있다. 위 예시에서는 앞에 끝난 회의 시간이 2이기 때문에 시작 시간이 2이상인 회의를 찾는다. <5,6>이 이를 만족한다. <2,7>의 경우 앞에 끝난 회의 시간 6보다 시작 시간이 이르기 때문에 진행될 수 없다. <8,9>의 경우에는 시작 시간이 6보다 뒤이기 때문에 조건을 만족하므로 회의가 진행될 수 있다.

 

이를 구현한 코드는 아래와 같다.

 

/*
20200329
baekjoon 1931번: 회의실 배정
*/
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main() {
	cin.tie(NULL); cout.tie(NULL); ios_base::sync_with_stdio(false);
	int n, ans = 1;
	vector<pair<int, int>>v;

	cin >> n;

	for (int i = 0; i < n; ++i) {
		int s, e;
		cin >> s >> e;
		//회의가 끝나는 시간 우선으로 정렬하기 위해 v의 first값으로 e를 넣음
		v.push_back({ e,s });
	}

	sort(v.begin(), v.end());

	int end = v[0].first;
	for (int i = 1; i < v.size(); ++i) {
		if (v[i].second >= end) {
			ans++;
			end = v[i].first;
		}
	}

	cout << ans;
}

'알고리즘 > baekjoon' 카테고리의 다른 글

[BOJ] 1918번: 후위 표기식  (0) 2020.05.03
[BOJ] 11399번: ATM  (0) 2020.03.29
[BOJ] 1120번: 문자열  (0) 2020.03.29
[BOJ] 3085번: 사탕 게임  (0) 2020.03.25
[BOJ] 1107: 리모컨  (0) 2020.03.25
Comments