티스토리 뷰

알고리즘

백준 11000 - 파이썬

취뽀가자!! 2023. 4. 23. 15:51

https://www.acmicpc.net/problem/11000

 

11000번: 강의실 배정

첫 번째 줄에 N이 주어진다. (1 ≤ N ≤ 200,000) 이후 N개의 줄에 Si, Ti가 주어진다. (0 ≤ Si < Ti ≤ 109)

www.acmicpc.net

문제 풀이

이 문제를 보고 가장 처음 떠올린 아이디어는 다음과 같다.

 

1. 먼저 시작시간 기준으로 정렬

2. 현재 강의의 끝나는 시간과 다음 강의의 시작 시간이 같거나 더 늦은 시간이 있는지 확인

3. 있다면 방을 카운트하고, 없다면 끝나는 시간과 시작 시간이 가장 근접한 강의 확인.

 

위 생각을 알고리즘으로 구현하고자 노력해 보았다. 처음에는 리스트로만 구현을 하다가 우선순위 큐를 사용하는 것이 좋을 거 같아 heapq라는 자료구조로 구현해 봤다. 1시간 반이 넘게 고민해 보았지만 답을 구하기 어려웠고, 결국 다른 사람의 풀이를 찾아보았다.

 

import heapq
import sys

n = int(sys.stdin.readline())

q = []

for i in range(n):
  start, end = map(int, sys.stdin.readline().split())
  q.append([start,end])

q.sort(key=lambda x : x[0])

room = []
heapq.heappush(room, q[0][1])

for i in range(1, n):
  if q[i][0] < room[0]:
    heapq.heappush(room, q[i][1])
  else:
    heapq.heappop(room)
    heapq.heappush(room, q[i][1])

print(len(room))

기본적으로 두번째 for문 위에 있는 room이라는 리스트에 가장 처음 수업의 끝나는 시간을 넣어주는 것까지는 같았다. 내가 구현해 내지 못한 부분은 이 부분이다.

for i in range(1, n):
  if q[i][0] < room[0]: # 현재 수업 끝나는 시간보다 다음 수업 시작시간이 빠르면
    heapq.heappush(room, q[i][1]) # 새로운 강의실 개설
  else:  # 현재 강의실에 이어서 강의 개최 가능
    heapq.heappop(room) # 새로운 수업으로 시간 변경을 위해 pop후 새 시간 push
    heapq.heappush(room, q[i][1])

room에는 현재 수업이 끝나는 시간이 담겨 있는데, 그 다음 수업의 시작시간과 비교하여 다음 수업의 시작시간이 빠르면 새로운 강의실을 개설하는 것이다.

 

나는 끝나는 시간과 시작 시간이 같거나 더 늦은 시간을 비교하여 새로운 강의실을 추가하고자 하였는데, 끝나는 시간과 시작 시간이 같다면 강의실을 추가할 필요가 없으므로 더 늦은 시간만 비교해도 되었던 것이다. 이 점이 내가 구현하는데 어려움을 줬던 점인것 같다. 정리하면, 새로운 강의실을 추가할 경우는 현재 수업의 끝나는 시간보다 시작시간이 빠른 강의일 때만이다. 따라서 이 경우에만 우선순위 큐에 추가해주면 되었던 것이다.

 

지금까지 그리디를 풀면서 느낀점은 조금만 더 생각을 다듬고 코드로 정리하면 풀 수 있는데, 아직까지는 이 부분이 가장 힘든점인거 같다. 이 벽을 뚫는다면 실력이 한층 더 오를 거 같다. 또한 자료구조를 적절히 사용하는 법 역시 숙달할 필요가 있어 보인다. 

'알고리즘' 카테고리의 다른 글

백준 2437 - 파이썬  (2) 2023.04.24
백준 2212 - 파이썬  (0) 2023.04.23
백준 1202 - 파이썬  (1) 2023.04.22
백준 1339 - 파이썬  (0) 2023.04.19
백준 1439 - 파이썬  (0) 2023.04.17
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
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
글 보관함