BOJ 11000 강의실 배정
BOJ 11000 강의실 배정
https://www.acmicpc.net/problem/11000
문제
수강신청의 마스터 김종혜 선생님에게 새로운 과제가 주어졌다.
김종혜 선생님한테는 $S_i$에 시작해서 $T_i$에 끝나는 N개의 수업이 주어지는데, 최소의 강의실을 사용해서 모든 수업을 가능하게 해야 한다.
참고로, 수업이 끝난 직후에 다음 수업을 시작할 수 있다. (즉, $T_i ≤ S_j$ 일 경우 i 수업과 j 수업은 같이 들을 수 있다.)
수강신청 대충한 게 찔리면, 선생님을 도와드리자!
입력
첫 번째 줄에 N이 주어진다. $(1 ≤ N ≤ 200,000)$
이후 N개의 줄에 $S_i, Ti$가 주어진다. $(0 ≤ S_i < T_i ≤ 10^9)$
출력
강의실의 개수를 출력하라.
예제 입력 1
3 1 3 2 4 3 5
예제 출력 1
2
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static class Class implements Comparable<Class> {
int start, end;
public Class(int start, int end) {
this.start = start;
this.end = end;
}
// 우선순위 큐에서 시작 시간이 빠른 수업부터 꺼내기 위함
@Override
public int compareTo(Class c) {
return this.start - c.start;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
PriorityQueue<Class> queue = new PriorityQueue<>();
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
queue.offer(new Class(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken())));
}
// 빠르게 수업이 끝나는 순으로 강의실을 뽑기 위한 큐
PriorityQueue<Integer> rooms = new PriorityQueue<>();
rooms.offer(queue.poll().end);
while (!queue.isEmpty()) {
Class check = queue.poll();
// 사용 중인 강의실 중 가장 빨리 종료되는 수업 시간 이후에 시작하는 수업에 강의실을 배정할 경우
// 가장 빨리 수업이 종료되는 강의실을 poll 한 뒤, 이후에 시작하는 수업의 종료시간을 offer 해 강의실을 배정
if(rooms.peek() <= check.start) rooms.poll();
// 만약 현재 사용 중인 강의실들의 종료시간이 강의실을 배정하려는 수업의 시작시간보다 늦을 경우
// 새로운 강의실을 배정
rooms.offer(check.end);
}
System.out.println(rooms.size());
}
}
This post is licensed under CC BY 4.0 by the author.