백준 11000번 - 강의실 배정

장근영·2024년 7월 1일
0

BOJ - 그리디

목록 보기
4/35

문제

백준 11000번 - 강의실 배정


아이디어

  • 강의를 시작 시간 순, 시작 시간이 같으면 종료 시간 순으로 정렬한다.
  • 우선순위 큐를 사용해 강의의 끝나는 시간을 저장한다.
  • 강의들을 순회하면서 강의의 시작 시간이 가장 빨리 끝나는 강의의 종료 시간보다 크기가 같으면 큐에서 제거한다.
  • 큐에는 계속 강의들의 종료 시간을 저장한다.
  • 이렇게 우선순위 큐를 사용하면 겹치는 강의를 포함하여 정확한 계산을 할 수 있다.

예상 시간 복잡도

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

코드 구현

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());
    }
}

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

0개의 댓글