문제
https://www.acmicpc.net/problem/19598
19598번: 최소 회의실 개수
서준이는 아빠로부터 N개의 회의를 모두 진행할 수 있는 최소 회의실 개수를 구하라는 미션을 받았다. 각 회의는 시작 시간과 끝나는 시간이 주어지고 한 회의실에서 동시에 두 개 이상의 회의
www.acmicpc.net
풀이 과정
1931번 회의실 배정 문제가 떠오르는 문제였다.
처음에는 회의실이 없다면 새로 만들고 회의실마다 시간을 비교해주면서 계산하는 2중 for문을 생각했는데 그렇게 하면 시간 초과가 날 것 같아 고민을 했다.
가장 먼저 끝나는 곳을 찾고 비교하는 것이 관건이었으므로 최솟값과 최댓값을 빠르게 찾는 heap이 생각나 이를 사용하여 해결할 수 있었다.
회의 끝나는 시간을 heap에 넣고, heap의 제일 처음 값과 다음 회의의 시작하는 시간과 비교하는 방식으로 문제를 해결할 수 있다.
풀이 과정은 아래와 같다.
- 입력받은 회의 정보들을 정렬해준다. (시간 순으로 비교해야 하므로)
- 회의실 리스트(
meeting_rooms
)에 맨 처음 시작하는 회의의 끝나는 시간(meetings[0][1]
)를 회의실에 넣어준다. - 두 번째 회의 정보부터 끝까지 for문을 돌면서 가장 먼저 끝나는 회의와 비교한다.
3-1. 회의(meeting
)가 회의실에서 가장 먼저 끝나는 회의보다 먼저 시작한다면, 회의실이 필요하므로 회의가 끝나는 시간을 회의실 리스트에 넣어준다.
3-2. 회의실에서 가장 먼저 끝나는 회의보다 늦게 시작한다면, 가장 먼저 끝나는 회의의 끝 시간을 현재 회의의 끝나는 시간으로 대체시킨다. (회의실 추가하지 않고 다른 회의가 끝나면 사용 가능) - 따라서 남은 회의실 개수가 최소 회의실 개수가 된다.
* heapreplace
: heap에서 최솟값을 pop 하고, 입력받은 값을 push 하지만 heap 크기는 변경되지 않는다. heappop한 다음 heappush하는 것보다 효율적이다. (하지만, heap이 비어있으면 인덱스 에러가 발생한다.)
* 공식 문서 참고
https://docs.python.org/ko/3/library/heapq.html
코드
import heapq n = int(input()) meetings = [list(map(int, input().split())) for _ in range(n)] meetings.sort() meeting_rooms = [meetings[0][1]] for meeting in meetings[1:]: # 1. heapreplace 사용 => heappush, heappop 두 연산을 하는 것보다 효율적이다. if meeting[0] < meeting_rooms[0]: heapq.heappush(meeting_rooms, meeting[1]) else: heapq.heapreplace(meeting_rooms, meeting[1]) # 2. heappop, heappush 사용 # if meeting[0] >= meeting_rooms[0]: # heapq.heappop(meeting_rooms) # heapq.heappush(meeting_rooms, meeting[1]) print(len(meeting_rooms))
'Algorithm > Baekjoon' 카테고리의 다른 글
[Python] 1325. 효율적인 해킹 (0) | 2022.11.21 |
---|---|
[Python] 1939. 중량제한 (0) | 2022.11.03 |
[Python] 15586. MooTube (Gold) (0) | 2022.10.18 |
[Python] 15991. MooTube (Silver) (0) | 2022.10.05 |
[Python] 13335. 트럭 (2) | 2022.10.05 |