문제
백준 11000번 - 강의실 배정
아이디어
- 강의를 시작 시간 순, 시작 시간이 같으면 종료 시간 순으로 정렬한다.
- 우선순위 큐를 사용해 강의의 끝나는 시간을 저장한다.
- 강의들을 순회하면서 강의의 시작 시간이 가장 빨리 끝나는 강의의 종료 시간보다 크기가 같으면 큐에서 제거한다.
- 큐에는 계속 강의들의 종료 시간을 저장한다.
- 이렇게 우선순위 큐를 사용하면 겹치는 강의를 포함하여 정확한 계산을 할 수 있다.
예상 시간 복잡도
코드 구현
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 BJ_11000 {
static class Lecture implements Comparable<Lecture> {
int start, end;
public Lecture(int start, int end) {
this.start = start;
this.end = end;
}
@Override
public int compareTo(Lecture o) {
if (this.start == o.start) {
return this.end - o.end;
}
return this.start - o.start;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
Lecture[] lectures = new Lecture[n];
for (int i = 0; i < n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int s = Integer.parseInt(st.nextToken());
int e = Integer.parseInt(st.nextToken());
lectures[i] = new Lecture(s, e);
}
Arrays.sort(lectures);
PriorityQueue<Integer> qu = new PriorityQueue<>();
qu.offer(lectures[0].end);
for (int i = 1; i < n; i++) {
if (!qu.isEmpty() && lectures[i].start >= qu.peek()) {
qu.poll();
}
qu.offer(lectures[i].end);
}
System.out.println(qu.size());
}
}