[白準/11000]教室の手配(Java)


Question

  • 問題リンク:https://www.acmicpc.net/problem/110002
  • 分類:優先キュー
  • 解答時間:40分
  • 問題の説明

  • Si
  • TI終了までのNレッスン開始
  • すべてのコースを許可する教室の最低数は?
  • Solution


    プールアクセス方法


  • 講義の質問をできるだけ多くして~->「終わる時間は昇順に並べて」という答えは間違っています!
  • が終わる時間昇順は1つの教室でできるだけ多くの授業を行う時!!

  • 授業中の空き時間を最小化する=授業後と次の授業開始時間の間隔を小さくする
  • 課の時間は昇順に並び、終了時に快速開始課程
  • に加入する.
  • 反例確認

  • クラス時間昇順->クラス情報オブジェクト(Session Class)を作成して優先順位キューに入れ、1つずつスキップします

  • 授業後の時間を優先キューで管理し、授業をより迅速に理解できるようにします.
  • 正しいコード

    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.util.PriorityQueue;
    import java.util.StringTokenizer;
    
    public class Main {
      static class Session implements Comparable<Session> {
        int start, end;
    
        public Session(int start, int end) {
          this.start = start;
          this.end = end;
        }
    
        @Override
        public int compareTo(Session o) {
          // 시작시간 오름차순
          if (Integer.compare(this.start, o.start) == 0) {
            // 시작시간이 같다면, 종료시간 오름차순
            return Integer.compare(this.end, o.end);
          }
          return Integer.compare(this.start, o.start);
        }
      }
    
      static int N;
    
      public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    
        N = Integer.valueOf(br.readLine());
        // 시간시간 오름차순 순서대로 강의 담음
        PriorityQueue<Session> sessions = new PriorityQueue<Session>();
    
        for (int i = 0; i < N; i++) {
          StringTokenizer st = new StringTokenizer(br.readLine());
          int start = Integer.valueOf(st.nextToken());
          int end = Integer.valueOf(st.nextToken());
    
          sessions.add(new Session(start, end));
        }
    
        // 강의실 개수 변수 : 1개로 시작
        int classCnt = 1;
        // 강의실별 끝나는 시간을 저장하는 큐 : 빨리 끝나는 강의싱이 우선순위 높음
        // 큐의 사이즈 = 오픈한 강의실 개수
        PriorityQueue<Integer> endQueue = new PriorityQueue<>();
        // 첫 강의실에서 진행하는 강의의 끝나는 시간 넣음
        endQueue.add(sessions.poll().end);
    
        // 모든 강의가 강의실에 들어갈 때 까지
        while (!sessions.isEmpty()) {
          Session current = sessions.poll();
    
          // 제일 빨리 끝나는 강의실의 종료 시간이 현대 시작해야할 강의보다 빠르면
          if (endQueue.peek() <= current.start) {
            // 해당 강의실 수업 종료
            endQueue.poll();
          } else {
            // 제일 빨리 끝나는 강의보다 시작 시간이 더 빠르면
            // 새로운 강의실 오픈
            classCnt++;
          }
          // 수업 종료한 강의실 || 새로 오픈한 강의실에 강의 넣음
          endQueue.add(current.end);
        }
    
        bw.write(classCnt + "\n");
        bw.flush();
        bw.close();
      }
    
    }