문제
백준 11000번: 강의실 배정 (골드 5)
https://www.acmicpc.net/problem/11000
11000번: 강의실 배정
첫 번째 줄에 N이 주어진다. (1 ≤ N ≤ 200,000) 이후 N개의 줄에 Si, Ti가 주어진다. (0 ≤ Si < Ti ≤ 109)
www.acmicpc.net
풀이과정
(start_time, end_time)을 tuple형태로 리스트에 저장한 뒤 정렬한다는 것,
그리고 각각의 시간을 강의실 저장 배열의 원소들과 비교해야한다는 것까진 생각해냄.
하지만 강의실 저장 배열이 항상 정렬 상태를 유지하면 비교가 쉬워진다는 것을 생각해내지 못함.
==> 우선순위 큐, heapq 라이브러리 사용!
강의실 저장 배열의 첫번째 원소가 항상
가장 처음으로 끝나는 강의실 (end_time이 가장 빠른 강의실)을 저장해야 한다는 점을 생각해야 함.
그 뒤 수업 시간을 저장한 배열에서 시작시간와 끝나는 시간을 꺼내어 비교하면 됨.
비교하면서 필요한 pop과 push는 각각 heapq라이브러리의 heappush()와 heappop()을 사용하여
항상 첫번째 원소가 최소값이 되도록 설정해야함.
- 참고: heapq 라이브러리 사용법: https://5ji-record.tistory.com/144
[Python 자료구조] max-heap, min-heap과 heapq 모듈
heap heap이란 최대값 또는 최소값을 빠르게 찾기 위해서 고안된 트리모양의 자료구조이다. 이진 트리에서 각 노드의 키 값이 그 자식 노드보다 큰 트리를 최대 트리(max tree)라고 하며, 최대 힙(max h
5ji-record.tistory.com
제출한 코드
import sys
import heapq
# 정렬상태를 유지해야하므로 우선순위 큐 사용
input = sys.stdin.readline
n = int(input())
lecs = []
rooms = []
for _ in range(n):
start, end = map(int, input().split())
lecs.append((start, end))
lecs.sort()
rooms.append(lecs[0][1])
for (s, e) in lecs[1:]:
if s < rooms[0]:
heapq.heappush(rooms, e)
else:
heapq.heappop(rooms)
heapq.heappush(rooms, e)
print(len(rooms))
'⌨️ Algorithm > Python' 카테고리의 다른 글
[Python] itertools 라이브러리 (0) | 2023.01.19 |
---|---|
[Algorithm] Week 3. 구현 (0) | 2023.01.17 |
[Python 문제풀이] 백준 2212번: 센서 (0) | 2023.01.14 |
[Python 문법] 람다(lambda) (0) | 2023.01.12 |
[Python 자료구조] max-heap, min-heap과 heapq 모듈 (0) | 2023.01.12 |
댓글