본문 바로가기
알고리즘 & 자료구조/백준

백준 11000

by 신재권 2023. 7. 28.

11000번: 강의실 배정


문제

수강신청의 마스터 김종혜 선생님에게 새로운 과제가 주어졌다.

김종혜 선생님한테는 Si에 시작해서 Ti에 끝나는 N개의 수업이 주어지는데, 최소의 강의실을 사용해서 모든 수업을 가능하게 해야 한다.

참고로, 수업이 끝난 직후에 다음 수업을 시작할 수 있다. (즉, Ti ≤ Sj 일 경우 i 수업과 j 수업은 같이 들을 수 있다.)

수강신청 대충한 게 찔리면, 선생님을 도와드리자!

  • 첫 번째 줄에 N이 주어진다. (1 ≤ N ≤ 200,000)
  • 이후 N개의 줄에 Si, Ti가 주어진다. (0 ≤ Si < Ti ≤ 109)
  • 강의실의 개수를 출력하라.
  • 시간 제한 : 1초
  • 메모리 제한 : 256

문제 풀이 과정

회의실 배정 문제랑 비슷하게 시작 시간, 끝나는 시간이 주어진다.

회의실 배정은 최대 몇 개의 회의를 진행할 수 있는지를 찾아야 했다. 즉 겹치는 시간을 카운트 하지 않았다.

이번 문제는 몇 개의 회의를 진행하는 것이 아닌, 겹치는 시간을 카운트 하면 된다.

 

먼저 입력값들을 강의 시작 시간 오름 차순 으로 정렬한다.

만약 시작 시간이 같으면 끝나는 시간 오름 차순 으로 정렬한다.

그리고 우선순위큐를 선언해, 여기에다가는 끝나는 시간을 담는다.

 

그 후, 입력값들을 순회하며, 우선순위 큐의 첫번째 원소랑 비교해 시작시간이 조건에 맞으면, 기존 끝나는 시간을 빼준다.

그리고 공통적으로 끝나는 시간을 넣어준다.

 

위 작업을 반복하면, 겹치지 않는 시간은 조건에 걸려 원소가 빠지고, 공통적으로 끝나는 시간을 담기 때문에 개수에 변화가 없다.

만약 겹치는 시간이면 조건에 걸리지 않기 때문에 개수에 변화가 생긴다.


정답 코드

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

class Main11000 {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		PriorityQueue<Integer> pq = new PriorityQueue<>();
		List<Pair> list = new ArrayList<>(N);

		for (int i = 0; i < N; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine());
			int start = Integer.parseInt(st.nextToken());
			int end = Integer.parseInt(st.nextToken());

			list.add(new Pair(start, end));
		}

		Collections.sort(list);
		pq.add(list.get(0).end);

		for (int i = 1; i < N; i++) {
			if (pq.peek() <= list.get(i).start) {
				pq.poll();
			}

			pq.add(list.get(i).end);
		}

		System.out.println(pq.size());
	}

	private static class Pair implements Comparable<Pair> {
		int start;
		int end;

		public Pair(int start, int end) {
			this.start = start;
			this.end = end;
		}

		@Override
		public int compareTo(Pair o) {
			if (this.start == o.start) {
				return this.end - o.end;
			}
			return this.start - o.start;
		}
	}
}

'알고리즘 & 자료구조 > 백준' 카테고리의 다른 글

백준 2212  (0) 2023.08.02
백준 13164  (0) 2023.07.30
백준 2138  (0) 2023.07.26
백준 17615  (0) 2023.07.26
백준 21758  (0) 2023.07.25