문제
수강신청의 마스터 김종혜 선생님에게 새로운 과제가 주어졌다.
김종혜 선생님한테는 Si에 시작해서 Ti에 끝나는 N개의 수업이 주어지는데, 최소의 강의실을 사용해서 모든 수업을 가능하게 해야 한다.
참고로, 수업이 끝난 직후에 다음 수업을 시작할 수 있다. (즉, Ti ≤ Sj 일 경우 i 수업과 j 수업은 같이 들을 수 있다.)
수강신청 대충한 게 찔리면, 선생님을 도와드리자!
입력
첫 번째 줄에 N이 주어진다. (1 ≤ N ≤ 200,000)
이후 N개의 줄에 Si, Ti가 주어진다. (0 ≤ Si < Ti ≤ 109)
출력
강의실의 개수를 출력하라.
예제 입력1
3
1 3
2 4
3 5
예제 출력1
2
# Code
import heapq
import sys
input = sys.stdin.readline
n = int(input())
time = [list(map(int, input().split())) for _ in range(n)]
time = sorted(time, key = lambda x : x[0])
queue = []
heapq.heappush(queue, time[0][1])
for i in range(1, n):
if queue[0] <= time[i][0]:
heapq.heappop(queue)
heapq.heappush(queue, time[i][1])
print(len(queue))
# Comment
회의실 배정 문제를 생각하고 똑같이 정렬한 다음 이중 포문 이용해서 어떻게 끙차끙차 풀었는데.. 시간초과가 떠서 .. ㅎㅎ 이중 포문으로 풀면 안된다고 한다.
우선 강의들을 시작 시간을 기준으로 오름차순 정렬해줘야 한다.
ex)
4
1 3
1 5
3 6
5 5
시작 시간 기준으로 정렬 하면 (1, 3) (3, 7) / (1, 5) (5, 6) -> 2
그러나 끝나는 시간 기준으로 정렬 하면 (1, 3) (5, 5) / (1, 5) / (3, 6) -> 3
따라서 시작 시간 기준으로 정렬해야 강의실의 최솟값이 나온다.
그리고 우선 순위 큐를 이용했는데, 우선 queue 에 첫 강의의 끝나는 시간 값만 넣어준다. 끝나는 시간이 빠른 수업을 알아야 아직 강의실에 배치되지 않은 수업들의 시작 시간을 끝나는 시간과 비교해서 같은 강의실에서 수업을 연달아 듣도록 할 수 있기 때문이다.
그러나 만약 끝나는 값만 넣는 게 아닌, (시작 시간, 끝나는 시간) 을 그대로 넣으면 시작 시간이 더 빠른 수업이 앞으로 오게 된다. 그렇게 되면 강의실이 비는 타임에 수업을 들을 수 있음에도 불구하고 그냥 넘어가는 상황이 발생한다.
queue의 값(끝나는 시간)과 time[i]의 시작 시간을 비교했을 때, queue의 값이 작거나 같다면 같은 강의실에 배정할 수 있다는 뜻이고, queue에서 그 값을 pop해준다. 그리고 time[i]의 끝나는 시간을 queue에 넣어준다.
만약에 queue의 값이 time[i]의 시작 시간보다 크다면 이는 다른 강의실을 배정해야 한다는 뜻이므로 queue에 새로 time[i]의 끝나는 시간을 추가해준다.
마지막으로 queue의 크기가 곧 강의실의 갯수이므로 print(len(queue))를 해준다.
.. 어렵다 역시 골드는 더 어렵다.
'백준 > 그리디' 카테고리의 다른 글
[백준] #20044 Project Teams (python) (0) | 2022.03.22 |
---|---|
[백준] #13164 행복 유치원 (python) (0) | 2022.03.17 |
[백준] #21314 민겸 수 (python) (0) | 2022.03.16 |
[백준] #21758 꿀 따기 (python) (0) | 2022.03.15 |
[백준] #16953 A->B (python) (1) | 2022.03.12 |
댓글