반응형
문제 : https://www.acmicpc.net/problem/1931
서론
그리디 알고리즘.
시작시간을 기준으로 가능한 모든 경우의 수 탐색 -> 시간초과
종료시간을 기준으로 그리디 알고리즘 -> 통과
배낭문제와 함께 그리디 알고리즘의 대표적 문제.
아이디어
1. 종료시간을 기준으로 오름차순 정렬한다. 종료시간이 같다면 시작시간을 기준으로 오름차순 정렬한다.
2. 정렬한 배열에서 회의를 하나 가져오고 회의 수를 +1 해준다.
3. 정렬한 배열을 탐색하여 가져온 회의의 종료시간 이후에 회의가 시작하면 회의를 가져오고 회의 수를 +1 해준다.
4. 3을 반복한다.
구현
// c++
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool compare(pair<int, int>a, pair<int, int>b) {
if (a.second == b.second) {
return a.first < b.first;
}
else {
return a.second < b.second;
}
}
int main() {
vector<pair<int, int>>v;
int n;
cin >> n;
for (int i = 0; i < n; i++) {
int a, b;
cin >> a >> b;
v.push_back({ a,b });
}
sort(v.begin(), v.end(), compare);
int cnt = 0;
int now = v[0].second;
for (int i = 1; i < n; i++) {
if (v[i].first >= now) {
cnt++;
now = v[i].second;
}
}
cout << cnt + 1;
}
최근댓글