[BOJ-11000] 강의실 배정 (Python)

yuseon Lim·2021년 7월 19일
0

Problem Solving

목록 보기
36/37
post-thumbnail

🤒 문제

BOJ-11000 강의실 배정

💊 풀이

이 문제는 boj-1931 회의실 배정 과 함께 보면 좋다.
회의실 배정은 한 회의실을 가지고 최대한 많은 회의를 하도록 하는 것이고, 강의실 배정은 최소의 강의실을 사용해 모든 수업을 가능하게 하는 것이다.

Si < Ti 이기 때문에, 강의 시작시간이 늦을수록 끝나는 시간도 늦을 것이다.
A(3,5), B(2,4) 라고 했을 때, 늦게 시작하는 강의 A가 강의실에 먼저 배정이 된다면 그 다음 배정되는 강의 B의 끝나는 시간이 A의 시작시간보다 늦기 때문에 같은 강의실에 배정 할 수 없게 된다.

따라서 이 문제에서 최소의 강의실을 사용하려면, 시작시간을 기준으로 오름차순 으로 정렬한 뒤 배정해야 한다. 나는 heapq모듈을 사용해 정렬했다. 문제 푸는 과정은 이렇다.

  1. 입력 받은 강의 정보를 courses시작하는 시간을 기준으로 최소힙이 되도록 heappush()한다.

  2. 시작 시간을 기준으로 오름차순으로 정렬했기 때문에, i번째 다음 i+1번째를 배정할 때, 같은 강의실에서 i+1번째를 i번째보다 더 이른 시간으로 배정할 일은 없다. 따라서 해당 강의실에 가장 늦게 배정된 강의의 끝나는 시간만 알고 있으면, 그 다음 강의를 배정 할 수 있다.

  3. 최소힙 end_time에 첫번째 강의의 끝나는 시간을 넣고 시작한다.

  4. courses 를 모두 배정할 때까지 while문을 돌며, course를 하나씩 pop한다. (S, T)

  5. 끝나는 시간이 가장 빠른 강의실과 pop한 강의의 시작 시간 S를 비교하여 원래있던 강의실에 배정할 수 있다면 원래의 강의실의 end_time을 pop하고 T를 push한다. 배정 할 수 없다면 pop 하지 않고 push 한다. 즉 사용 강의실이 하나 늘어난다.
    (end_time[0] 과만 비교하는 이유는, end_time[0]이 최소힙의 루트, 최솟값이기 때문에 end_time[0] <= S를 만족하지 못한다면 나머지도 만족 못하기 때문.)

  6. 강의 배정을 다 끝내고 end_time의 length를 구하면 그것이 답

✨ 소스코드

import sys
import heapq

N = int(input())

courses = []
end_time = []

for _ in range(N):
    S, T = map(int, sys.stdin.readline().split())
    # 시작하는 시간 기준 최소힙
    heapq.heappush(courses, (S, T))

heapq.heappush(end_time, heapq.heappop(courses)[1])

while courses:
    S, T = heapq.heappop(courses)

    if end_time[0] <= S:
        heapq.heappop(end_time)

    heapq.heappush(end_time, T)

print(len(end_time))

profile
🔥https://devyuseon.github.io/ 로 이사중 입니다!!!!!🔥

0개의 댓글