문제
수강신청의 마스터 김종혜 선생님에게 새로운 과제가 주어졌다.
김종혜 선생님한테는 Si에 시작해서 Ti에 끝나는 N개의 수업이 주어지는데, 최소의 강의실을 사용해서 모든 수업을 가능하게 해야 한다.
참고로, 수업이 끝난 직후에 다음 수업을 시작할 수 있다. (즉, Ti ≤ Sj 일 경우 i 수업과 j 수업은 같이 들을 수 있다.)
수강신청 대충 한 게 찔리면, 선생님을 도와드리자!
입력
첫 번째 줄에 N이 주어진다. (1 ≤ N ≤ 200,000)
이후 N개의 줄에 Si, Ti가 주어진다. (1 ≤ Si < Ti ≤ 109)
출력
강의실의 개수를 출력하라.
풀이
import heapq
import sys
heap = []
tc = int(input())
timetable = [list(map(int,sys.stdin.readline().split())) for _ in range(tc)]
timetable.sort(key=lambda a: a[0])
heapq.heappush(heap, timetable[0][1])
for i in range(1, tc):
if heap[0] > timetable[i][0]:
heapq.heappush(heap, timetable[i][1])
else:
heapq.heappop(heap)
heapq.heappush(heap, timetable[i][1])
print(len(heap))
문제 풀이
우선 순위 큐를 활용하는 문제로 코딩 테스트에 다양하게 바뀌어서 나오는 문제 유형 가운데 하나이다.
- 입력받은 강의 시간표들을 배열로 만들고 시작하는 시간을 기준으로 정렬한다.
- 정렬된 배열을 heap 배열에 끝나는 시간으로 넣는다.
- 끝나는 시간이 시간표의 시작 시간보다 크다면 끝나는 시간을 배열에 추가한다.
- 시간이 작거나 같다면 강의를 할 수 있다는 의미이므로 heap배열에서 제거하고 새로운 시간표를 추가한다.
- 반복문이 종료되고 남은 배열의 크기가 강의실의 개수이다.
'알고리즘' 카테고리의 다른 글
[프로그래머스] 방문길이 (0) | 2021.05.18 |
---|---|
[BOJ/백준] 11286번 절댓값 힙 (0) | 2021.05.10 |
[프로그래머스] 게임 맵 최단거리 (0) | 2021.05.07 |
[프로그래머스] 2019 KAKAO BLIND RECRUITMENT 오픈채팅방 (0) | 2021.05.07 |
[BOJ/백준] 14503번 로봇 청소기 (0) | 2021.04.30 |