#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
pair<int, int> arr[100002];
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
int n; cin >> n;
// 끝나는 시간을 기준으로 정렬해야 하기 때문에 끝나는 시간을 앞에 둔다.
for(int i = 1; i <= n; i++) {
int a, b; cin >> a >> b;
arr[i] = {b, a};
}
// 끝나는 시간, 시작하는 시간을 기준으로 정렬
sort(arr+1, arr+n+1);
// 제일 먼저 시작하는 회의는 끝나는 시간이 최솟값인 회의의다.
// 그래서 arr[1]의 값을 초기값으로 시작한다.
int ans = 1;
int endTime = arr[1].X;
for(int i = 2; i <= n; i++) {
// endTime이 현재 회의의 시작시간보다 크면 continue
if(endTime > arr[i].Y) continue;
// ans와 endTime update
ans++; endTime = arr[i].X;
}
cout << ans;
}
처음부터 모든 경우의 수를 구하는 것이 아니라 가장 최적인 방법을 이용해서 풀이를 하는 그리디 알고리즘의 문제였다.