문제
백준 9576번 - 책 나눠주기
아이디어
- 책을 최대로 주기 위해서는 선택 범위가 좁은 학생들을 먼저 나눠주고, 선택 범위가 넓은 학생들은 범위가 좁은 학생들이 먼저 받게 한 다음 자신의 넓은 범위를 활용하는 것이 유리할 것이다.
m
개의 a
, b
를 입력받아 b
를 기준으로 정렬한다. 즉, 범위의 마지막을 정렬하여 범위가 좁은 학생부터 배정받도록 한다.
- 정렬된 각 학생의
a
~ b
까지 순차적으로 탐색하며 배정되도록 한다.
예상 시간 복잡도
코드 구현
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();
}
}