https://www.acmicpc.net/problem/14464


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main {
    static int C, N;
    static int[] chickens;
    static Cow[] cows;
    static void input() {
        Reader scanner = new Reader();
        C = scanner.nextInt();
        N = scanner.nextInt();
        chickens = new int[C];
        cows = new Cow[N];
        for(int idx = 0; idx < C; idx++)
            chickens[idx] = scanner.nextInt();
        for(int idx = 0; idx < N; idx++)
            cows[idx] = new Cow(scanner.nextInt(), scanner.nextInt());
    }
    static void solution() {
        Arrays.sort(chickens);
        Arrays.sort(cows); // 소의 시작 시간 기준 오름차순으로, 시작 시간이 같다면 마지막 시간 기준 오름차순으로 정렬
        // 각 닭이 도와줄 수 있는 소의 마지막 시간들을 저장하는 PriorityQueue
        PriorityQueue<Integer> queue = new PriorityQueue<>();
        int answer = 0, cowIdx = 0;
        // 각 닭의 시간을 순회하면서 각 닭에 소를 배치한다
        for(int idx = 0; idx < C; idx++) {
            int chicken = chickens[idx]; // 현재 닭의 시간
            // 소들을 순회하면서 소의 시작 시간이 현재 닭의 시간보다 작거나 같은 소라면
            // 현재 닭에 배치될 수 있는 소이기 때문에 queue에 소의 마지막 시간을 저장한다
            // 소의 시작 시간이 현재 닭의 시간보다 커지게 되면 해당 소부터는 현재 닭에 배치될 수 없는 소이므로 더이상 순회하지 않는다
            while(cowIdx < N && cows[cowIdx].start <= chicken)
                queue.offer(cows[cowIdx++].end);
            // 소의 마지막 시간이 현재 닭의 시간보다 작다면 해당 소에는 현재 닭을 배치할 수 없기 때문에
            // queue에서 제거한다
            while(!queue.isEmpty() && queue.peek() < chicken)
                queue.poll();
            // queue에 값이 존재한다면 마지막 시간이 가장 빠른 소에 현재 닭을 배치하는 것이
            // 가장 많은 소에 닭을 배치할 수 있는 방법이기 때문에 마지막 시간이 가장 빠른 소에 현재 닭을 배치한다
            if(!queue.isEmpty()) {
                int endTime = queue.poll();
                answer++;
            }
        }
        System.out.println(answer);
    }
    static class Cow implements Comparable<Cow> {
        int start, end;
        public Cow(int start, int end) {
            this.start = start;
            this.end = end;
        }
        @Override
        public int compareTo(Cow o) {
            if(start != o.start) return start - o.start;
            return end - o.end;
        }
    }
    public static void main(String[] args) {
        input();
        solution();
    }
    static class Reader {
        BufferedReader br;
        StringTokenizer st;
        public Reader() {
            br = new BufferedReader(new InputStreamReader(System.in));
        }
        String next() {
            while(st == null || !st.hasMoreElements()) {
                try {
                    st = new StringTokenizer(br.readLine());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return st.nextToken();
        }
        int nextInt() {
            return Integer.parseInt(next());
        }
    }
}
큰 도움이 되었습니다, 감사합니다.