#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;
}
처음부터 모든 경우의 수를 구하는 것이 아니라 가장 최적인 방법을 이용해서 풀이를 하는 그리디 알고리즘의 문제였다.