[BOJ] 백준 11000번 강의실 배정 (Python)

deannn.Park·2021년 8월 7일
0
post-thumbnail

문제

수강신청의 마스터 김종혜 선생님에게 새로운 과제가 주어졌다.

김종혜 선생님한테는 Sᵢ에 시작해서 Tᵢ에 끝나는 N개의 수업이 주어지는데, 최소의 강의실을 사용해서 모든 수업을 가능하게 해야 한다.

참고로, 수업이 끝난 직후에 다음 수업을 시작할 수 있다. (즉, Tᵢ ≤ Sⱼ 일 경우 i 수업과 j 수업은 같이 들을 수 있다.)

수강신청 대충한 게 찔리면, 선생님을 도와드리자!

입력

  • 첫 번째 줄에 N이 주어진다. (1 ≤ N ≤ 200,000)
  • 이후 N개의 줄에 Sᵢ, Tᵢ가 주어진다. (1 ≤ Sᵢ < Tᵢ ≤ 10⁹)

출력

  • 강의실의 개수를 출력하라.

예제

입력 1

3
1 3
2 4
3 5

출력 1

2

입력 2

10
1 20000
100 200000
400 1000
500 2000
1100 2000
2000 3000
2500 10000
3000 20000
4000 5000
4500 5000

출력 2

6

풀이

import heapq

# 입력
N = int(input())
lessons = [list(map(int, input().split())) for _ in range(N)]

lessons.sort()		# 입력받은 수업들을 시작시간 순서대로 오름차순 정렬
_in_lesson = []		# 현재 진행중인 수업들의 끝나는 시간들을 담을 힙.
max_classroom = 0	# 필요한 강의실 수

# 각 수업을 한개씩 가져와 확인
for lesson in lessons:

    # 현재 수업이 없다면
    if not _in_lesson:	
    
        # 이번 순서의 수업을 힙에 담음
        heapq.heappush(_in_lesson, lesson[1])			
        
    # 현재 진행중인 수업 중 끝난 수업이 있는지 찾는다. 
    # 리스트에서 한개씩 가져와 이번 수업의 시작시간 이전(동일 포함)인 값이 있는지 확인.
    elif any(lesson[0] <= t for t in _in_lesson):	
    
        # 힙이 비거나 최소힙이 이번 수업의 시작시간보다 늦을 때 까지 반복
        while _in_lesson and _in_lesson[0] <= lesson[0]:
            heapq.heappop(_in_lesson)		# 최소힙 pop
        
        heapq.heappush(_in_lesson, lesson[1])	# 이번 수업의 종료시각을 힙에 push

    # 현재 진행중인 수업들의 개수 == 강의실 개수.
    # 현재 사용중인 강의실의 개수를 max_classroom과 비교 후 큰 수 저장
    max_classroom = max(max_classroom, len(_in_lesson))


print(max_classroom)

수업들이 시작된 순서와 끝나는 순서는 모두 다를 수 있다. 따라서 시작되는 순서대로 리스트에 끝나는 시간을 담은 후에, 다음 수업이 시작 될 때 다음 수업의 시작시간보다 일찍 끝나는 수업들을 없애줘야 했다.
그러기 위해서는 처음에는 리스트의 모든 원소를 다음 수업의 시작시간과 일일이 모두 비교하여 이를 제외하여 다시 리스트를 만드는 방법이 있었다. 하지만 이는 불필요한 연산이 많이 필요했다.
내가 필요한 것은 리스트에서 다음수업 시작 시간보다 작은 값을 제외시키기만 하면 되었다. 따라서 최소힙 알고리즘을 사용하여 최소힙이 다음수업 시작시간보다 커질 때 까지 모두 pop하였다. 그 후에 다음 수업을 리스트에 추가하였다.

결과

pypy3 컴파일러에서는 성공했지만 python3 컴파일러에서는 시간 초과가 떴다.

profile
컴퓨터 관련 여러 분야 공부중

0개의 댓글