일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 백트래킹
- 다이나믹프로그래밍
- 다시
- 수학
- 해시
- 그리디
- 그래프 이론
- 투포인터
- 우선순위큐
- 서브쿼리
- 그래프 탐색
- 재귀
- MST
- 누적합
- 플로이드-워셜
- 에라토스테네스의 체
- 시뮬레이션
- 크루스칼
- 다이나믹 프로그래밍
- 다익스트라
- 브루트포스
- DFS
- 구현
- 자료구조
- DP
- 분할정복
- BFS
- GROUP BY
- join
- 트리
- Today
- Total
기록하고 까먹지 말기
11000 본문
날짜 : 2022. .
사용 언어 : python
문제
코드
import sys
import heapq
n = int(sys.stdin.readline())
cl = []
room = []
for i in range(n):
cl.append(list(map(int, sys.stdin.readline().split())))
cl.sort(key = lambda x : x[0]) # 시작시간 순서로 sort
heapq.heappush(room, cl[0][1]) # 첫 강의의 종료시간 push
for i in range(1, n):
if cl[i][0] < room[0]: # 강의실이 사용중인 경우
heapq.heappush(room, cl[i][1])
else: # 기존강의실 사용 가능
heapq.heappop(room)
heapq.heappush(room, cl[i][1]) # push와 동시에 sort되어 저장
print(len(room))
알게된 점
- 수업을 저장한 cl 리스트와 강의실의 각 종료시간을 저장한 room 리스트를 만들었다.
- 그리고 시작시간과 종료시간을 입력받은 후 시작시간을 기준으로 오름차순으로 정렬했다.
- 이후 우선순위 큐를 이용해 첫 강의의 종료시간을 입력했고 for문으로 강의실을 추가해야 하는 경우(해당강의 시작시간이 가장 빨리 끝나는 사용중인 강의실의 종료시간보다 이른 경우)와 그렇지 않은 경우 두 가지 케이스로 분리하여 추가와 갱신을 적용함으로써 문제를 해결할 수 있었다.
- 한 30분정도 고민해서 나름 문제를 풀어봤지만 어떻게 강의실의 빈 시간을 채울지 아이디어가 떠오르지 않았다.
- 그래서 구글링을 해본 결과 우선순위 큐(힙)를 이용해 풀이하는 문제라는 것을 알게 되었고 heapq 모듈 또한 알게되었다.
- 기본적으로 알고 있던 자료구조 개념이지만 이렇게 코딩테스트에 사용하여 문제를 해결하는 것은 처음이었다.
참고 사이트
- https://suyeon96.tistory.com/31
[자료구조] 우선순위 큐와 힙 (Priority Queue & Heap)
1. 우선순위 큐 1.1 우선순위 큐란? 큐(Queue)는 먼저 들어오는 데이터가 먼저 나가는 FIFO(First In First Out) 형식의 자료구조이다. 우선순위 큐(Priority Queue)는 먼저 들어오는 데이터가 아니라, 우선순위
suyeon96.tistory.com
- https://velog.io/@slbin-park/백준-11000번-강의실-배정-파이썬