import java.util.PriorityQueue;
public class Main {
public static void main(String[] args) throws Exception {
int N = read();
PriorityQueue<int[]> classes = new PriorityQueue<>((int[] o1, int[] o2) -> {
if (o1[0] == o2[0]) return o1[1] - o2[1];
return o1[0] - o2[0];
});
PriorityQueue<Integer> ends = new PriorityQueue<>();
for (int i = 0; i < N; i++) {
int classNo = read();
int startTime = read();
int endTime = read();
classes.add(new int[] {startTime, endTime});
}
int room = 0;
while (!classes.isEmpty()) {
int[] now = classes.poll();
if (ends.isEmpty()) {
room++;
ends.add(now[1]);
continue;
}
int preEnd = ends.peek();
if (now[0] < preEnd) {
room++;
ends.add(now[1]);
}
else {
ends.poll();
ends.add(now[1]);
}
}
System.out.println(room);
}
private static int read() throws Exception {
int c, n = System.in.read() & 15;
while ((c = System.in.read()) > 32)
n = (n << 3) + (n << 1) + (c & 15);
return n;
}
}
PQ는 2개를 사용했다.
최적의 선택 : 강의 시작 시간이 바로 직전 강의 종료 시간보다 이전(미만)일 때에는 강의실을 추가하고, 아닐 경우에는 기존 강의실을 사용한다.
int[]
을 넣어서 사용하기 때문에, 별도로 Comparator
의 정렬 기준을 재정의 해준다. PriorityQueue<int[]> classes = new PriorityQueue<>((int[] o1, int[] o2) -> {
if (o1[0] == o2[0]) return o1[1] - o2[1];
return o1[0] - o2[0];
});
int preEnd = ends.peek();
if (now[0] < preEnd) {
room++;
ends.add(now[1]);
}
그렇지 않다면, 기존 강의실을 재사용 가능하므로 ends.poll()을 호출하여 기존 강의실의 종료 시간을 제거하고, 현재 강의의 종료 시간을 ends 큐에 추가한다.
else {
ends.poll();
ends.add(now[1]);
}
import java.io.StreamTokenizer
import java.util.PriorityQueue
fun main() = with(StreamTokenizer(System.`in`.bufferedReader())) {
fun read() : Int {
nextToken()
return nval.toInt()
}
val N = read()
val classes = PriorityQueue<IntArray> { o1, o2->
if (o1[0] == o2[0]) return@PriorityQueue o1[1] - o2[1]
return@PriorityQueue o1[0] - o2[0]
}
repeat(N) {
val no = read()
val s = read()
val e = read()
classes.add(intArrayOf(s, e))
}
val ends = PriorityQueue<Int>()
while (classes.isNotEmpty()) {
val now = classes.poll()
if (ends.isEmpty()) {
ends.add(now[1])
continue
}
val preEnd = ends.peek()
if (now[0] < preEnd) {
ends.add(now[1])
}
else {
ends.poll()
ends.add(now[1])
}
}
println(ends.size)
}