🟦/백준

[골드 5] 강의실 배정

진뚱이용 2023. 9. 21. 22:16

https://www.acmicpc.net/problem/11000

 

11000번: 강의실 배정

첫 번째 줄에 N이 주어진다. (1 ≤ N ≤ 200,000) 이후 N개의 줄에 Si, Ti가 주어진다. (0 ≤ Si < Ti ≤ 109)

www.acmicpc.net

옛날 회의실 배정 기억나서 그렇게 풀었다가 틀림

문제가 이해가 그냥 ㅈㄴ 안 됨 무슨 말인지 모르겠음

 

아 그니까 모든 시간을 검사해서 겹치는 max가 몇 개인지 구하는 문제구나

근데 모든 시간을 검사하면 당연히 시간초과 나겠지?

 

일단 보니까 시작 시간으로 정렬 왜? 시작한 시간부터 이제 강의실 하나를 차지하는 거야

그럼 다음 시간을 맞이했을 때 쓰던 강의실들 끝났으면 빼줘야지?

그래서 pQ로 풀어야 한다~

 

import java.util.*;
import java.io.*;

public class Main {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		StringTokenizer st;

		int N;
		int[][] arr;

		N = Integer.parseInt(br.readLine());
		arr = new int[N][2];

		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine());
			arr[i][0] = Integer.parseInt(st.nextToken());
			arr[i][1] = Integer.parseInt(st.nextToken());
		}

		////////////////////////////////////////////////////

		Arrays.sort(arr, new Comparator<int[]>() {

			@Override
			public int compare(int[] o1, int[] o2) {
				if (o2[0] > o1[0])
					return -1;
				else if (o2[0] == o1[0])
					return 0;
				else
					return 1;
			}
		});

		int answer = 0;
		PriorityQueue<Integer> pQ = new PriorityQueue<>();
		for (int i = 0; i < N; i++) {
			if (pQ.isEmpty()) {
				pQ.add(arr[i][1]);
			} else {
				while (!pQ.isEmpty()) {
					if (pQ.peek() <= arr[i][0])
						pQ.remove();
					else
						break;
				}
				pQ.add(arr[i][1]);
			}

			answer = Math.max(pQ.size(), answer);
		}

		System.out.println(answer);

	}
}