코딩뚠뚠

[백준문제풀이] 1931 회의실배정 본문

알고리즘 문제풀이/백준문제풀이

[백준문제풀이] 1931 회의실배정

로디네로 2021. 1. 1. 16:03
반응형

 

풀이일시 : 2020-10-16

 

문제 :

한 개의 회의실이 있는데 이를 사용하고자 하는 N개의 회의에 대하여 회의실 사용표를 만들려고 한다. 각 회의 I에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 회의의 최대 개수를 찾아보자. 단, 회의는 한번 시작하면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다. 회의의 시작시간과 끝나는 시간이 같을 수도 있다. 이 경우에는 시작하자마자 끝나는 것으로 생각하면 된다.

입력 :

첫째 줄에 회의의 수 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N+1 줄까지 각 회의의 정보가 주어지는데 이것은 공백을 사이에 두고 회의의 시작시간과 끝나는 시간이 주어진다. 시작 시간과 끝나는 시간은 231-1보다 작거나 같은 자연수 또는 0이다.

ex)

11

1 4

3 5

0 6

5 7

3 8

5 9

6 10

8 11

8 12

2 13

12 14

출력 :

첫째 줄에 최대 사용할 수 있는 회의의 최대 개수를 출력한다.

ex)

4

풀이 :

대표적인 greedy 알고리즘 문제인 회의실배정 문제이다.

회의실을 배정해서 회의하는 시간이 가장 긴 것을 찾는게 아니고, 할 수 있는 회의의 최대 갯수를 찾는 문제이다.

그렇다면 첫번째 회의는 언제 시작하던 가장 빠른 시간에 끝나는 회의가 돼야 할 것이다.

그 다음번 회의도 그 다음으로 빨리 끝나는 회의가 와야 될것이므로 모든 회의들을 끝나는 시간대로 정렬해야 할 것이다. 회의실이 비어야 그 다음번 회의를 진행할 수 있으므로 시작시간과 끝나는시간이 겹치지 않는 조건도 설정해 주어야 할 것이다.

 

dbstndi6316.tistory.com/62

 

[기본문제풀이] greedy 알고리즘

풀이 일시 : 2020-08-29 ​ 그리디알고리즘 : 당장 눈앞에의 최적의 상황만 쫓는 알고리즘이다. 대표적인 알고리즘으로는 가장 짧은 간선부터 연결하는 크루스칼 알고리즘이 있다. ​ 문제 : 총 몇

dbstndi6316.tistory.com

 

#include <iostream>
#include <cstdio>
#include <vector>
#include <utility>
#include <algorithm>

using namespace std;
bool sortbysec(const pair<int, int>& a, const pair<int, int>& b) {
	return (a.second < b.second);
}
int main() {

	int N, i, n1, n2, min, cnt = 0;

	cin >> N;
	vector <pair <int, int> > v;

	for (i = 0; i < N; i++) {
		cin >> n1 >> n2;
		v.push_back({ n1, n2 });
	}
	sort(v.begin(), v.end()); //정렬 후 
	sort(v.begin(), v.end(), sortbysec); //두번째 원소로 정렬
	//끝나는 시간이 가장 빠른 순서대로 정렬되게 된다.

	min = v[0].second;
	cnt++;

	for (i = 1; i < N; i++) { //0번은 한다치고 1번부터시작
		if (v[i].first >= min) { //이전이 끝난다음 시작하는것중에 가장 시간이 적게걸리는거
			min = v[i].second; //이것이 끝나는 시간을 min
			cnt++;
		}
	}

	printf("%d\n", cnt);
	return 0;
} 

 

참고자료 : sort

dbstndi6316.tistory.com/22

 

[개념정리] STL라이브러리 - sort()2

풀이 일시 : 2020-08-02 ​ 개념 : sort()의 활용방안 part2 ​ 활용1 : 클래스 대신 Pair 라이브러리 사용하기 #include #include #include using namespace std; int main() { vector >v; //vector pair 선언 v...

dbstndi6316.tistory.com

 

반응형