백준 9576번 - 책 나눠주기

장근영·2024년 10월 21일
0

BOJ - 그리디

목록 보기
26/35

문제

백준 9576번 - 책 나눠주기


아이디어

  • 책을 최대로 주기 위해서는 선택 범위가 좁은 학생들을 먼저 나눠주고, 선택 범위가 넓은 학생들은 범위가 좁은 학생들이 먼저 받게 한 다음 자신의 넓은 범위를 활용하는 것이 유리할 것이다.
  • m개의 a, b를 입력받아 b를 기준으로 정렬한다. 즉, 범위의 마지막을 정렬하여 범위가 좁은 학생부터 배정받도록 한다.
  • 정렬된 각 학생의 a ~ b까지 순차적으로 탐색하며 배정되도록 한다.

예상 시간 복잡도

  • 예상 시간 복잡도 : O(M x N)

코드 구현

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;

public class BJ_9576 {
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int t = Integer.parseInt(br.readLine());

        while (t-- > 0) {
            StringTokenizer st = new StringTokenizer(br.readLine());

            int n = Integer.parseInt(st.nextToken());
            int m = Integer.parseInt(st.nextToken());

            boolean[] check = new boolean[n + 1];
            int[][] arr = new int[m][2];

            for (int i = 0; i < m; i++) {
                st = new StringTokenizer(br.readLine());

                int a = Integer.parseInt(st.nextToken());
                int b = Integer.parseInt(st.nextToken());

                arr[i][0] = a;
                arr[i][1] = b;
            }

            //b를 기준으로 정렬
            Arrays.sort(arr, Comparator.comparingInt(o -> o[1]));

            int count = 0;

            for (int[] s : arr) {

                int a = s[0];
                int b = s[1];

                for (int i = a; i <= b; i++) {
                    if (check[i]) continue; //이미 배정된 책은 continue

                    check[i] = true;
                    count++;
                    break;
                }
            }

            bw.write(count + "\n");
        }

        bw.flush();
        bw.close();
        br.close();
    }
}

profile
오늘 할 일을 내일로 미루지 말자.

0개의 댓글