문제링크 : https://www.acmicpc.net/problem/1931
#include<cstdio>
#include<vector>
#include<utility>
#include<algorithm>
using namespace std;
// pair형은 가만히 sort만 하면 first만 sort하므로, second까지 sort해주기 위한 함수
bool mySort(const pair<int, int> &a, const pair<int, int> &b){
return (a.second < b.second);
}
int main(){
int N, min, cnt = 0;
scanf("%d",&N);
vector<pair<int, int> > v;
int ta, tb;
for(i=0; i<N; i++){
scanf("%d %d",&ta, &tb);
v.push_back(make_pair(ta, tb));
}
// pair의 first부분을 먼저 정렬한다.
sort(v.begin(), v.end());
// 이후 pair의 second 부분을 정렬한다.
sort(v.begin(), v.end(), mySort);
// 회의 종료시간이 빠른것이 더 중요하므로 pair의 second를 나중에 정렬한 것이다.
min = v[0].second;
cnt++;
for(int i=1; i<N; i++){
if(v[i].first >= min){
min = v[i].second;
cnt++;
}
}
printf("%d\n",cnt);
return 0;
}
매우 중요한 아이디어이다. 전형적인 그리디 알고리즘이고, 그리디라는걸 파악하지 못했기에 문제를 좀 해맸었다. 다시한번 잘 복습하자.