수강신청의 마스터 김종혜 선생님에게 새로운 과제가 주어졌다.
김종혜 선생님한테는 에 시작해서 에 끝나는 N개의 수업이 주어지는데, 최소의 강의실을 사용해서 모든 수업을 가능하게 해야 한다.
참고로, 수업이 끝난 직후에 다음 수업을 시작할 수 있다. (즉, ≤ 일 경우 i 수업과 j 수업은 같이 들을 수 있다.)
수강신청 대충한 게 찔리면, 선생님을 도와드리자!
입력
첫 번째 줄에 N이 주어진다. ()
이후 N개의 줄에 가 주어진다. ()
출력
강의실의 개수를 출력하라.
예제 입력 1 복사
3
1 3
2 4
3 5
예제 출력 1 복사
2
이 문제의 핵심은 최소한의 강의실 개수로 모든 수업을 배정하는 것입니다.
수업은 시작 시간()과 종료 시간()이 주어지며, 하나의 강의실에서는 동시에 두 개 이상의 수업이 진행될 수 없습니다. 단, 수업이 끝난 직후()에 다른 수업을 시작하는 것은 가능합니다.
입출력을 살펴보도록 하겠습니다.
이 문제는 최소한의 강의실 개수를 구해야 하는 문제입니다. 그렇다면 어떻게 해야 해결할 수 있을까요?
우선, 강의 시작 시간이 가장 빠른 강의가 강의실 1개를 먼저 차지해야 합니다. 그 다음은 해당 강의가 끝나는 시간과 가장 가깝게 시작하는 다른 강의실이 있다면 이것은 첫 강의가 사용했던 강의실을 사용할 수 있습니다.
따라서, 강의 시작 시간 순으로 정렬을 진행해야 한다는 것을 알 수 있습니다. 또한, 강의실을 재활용하기 위해 종료 시간 체크가 필요합니다. 따라서 우선순위 큐를 활용하여 종료 시간이 빠른 강의를 관리할 수 있습니다.
정리해보자면 다음과 같습니다.
import sys
from heapq import heappush, heappop
N = int(sys.stdin.readline().strip())
classes = [list(map(int, sys.stdin.readline().split())) for _ in range(N)]
def sol(classes):
classes.sort()
heap = []
for start, end in classes:
if heap and heap[0] <= start:
heappop(heap)
heappush(heap, end)
return len(heap)
print(sol(classes=classes))
정렬:
우선순위 큐:
- 각 강의에 대해 heappop()
과 heappush()
연산이 이루어집니다.
- 각 연산의 시간 복잡도: , 여기서 은 현재 큐의 크기.
- 최악의 경우, 이므로 .
전체 시간 복잡도:
이 문제를 통해 정렬, 우선순위 큐, 그리고 그리디 알고리즘의 실제 활용 사례를 경험했습니다. 해당 문제 유형은 다양한 최적화 문제로 확장 가능하므로 이를 기반으로 더 복잡한 문제에도 도전할 수 있습니다.
긴 글 읽어주셔서 감사합니다.
매일매일 발전하는 나!