[baekjoon] 강의실 배정

김민서·2024년 1월 18일
0

알고리즘 문제풀이

목록 보기
38/47

링크텍스트
어려웠다..

...

처음에 문제 이해도 잘 못했다..
아무튼 문제는

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

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

이다.
이를 풀어서 설명하자면, 한 강의의 시작 시간이 다른 강의의 끝나는 시간보다 앞선 경우, 강의실을 하나 더 개설해야 한다. 한 강의의 시작 시간이 다른 강의의 끝나는 시간보다 나중(이거나 같을 경우)일 경우에는 그냥 그 앞 강의가 끝난 강의실에서 강의를 진행해도 되므로 강의실을 더 개설하지 않아도 되는 것이다.
그래서 총 강의실의 수를 구하면 되고, 이는 최소여야 한다.

일단 강의의 시작 시간을 기준으로 정렬을 해줘야 한다는 것을 알 수 있었다.(느낌적으로)

n = int(input())
time = []
for _ in range(n):
    s, t = list(map(int, input().split()))
    time.append((s, t)) # 시작 시각, 끝나는 시각
time.sort()	# 오름차순 정렬

이 다음부터가 문제였는데 다른 문제도 풀어야 했기에 오랜 시도 끝에 결국 구글링을 했다.

코드는 다음과 같다.

# 시작 시각 기준으로 정렬된 time 배열에 대해
heap = [time[0][1]]	  # 맨 처음 강의가 끝나는 시각을 넣어줌

for i in range(1, n):	# 그 다음 강의부터 살펴봄

	# 처음 강의가 끝나는 시각이 
    # 그 다음 강의의 시작 시각보다 빠르거나 같다면
    if heap[0] <= time[i][0]:	# 강의실 만들 필요 없음
        heappop(heap)			# 최소힙(가장 작은 숫자가 먼저 나옴)에서 pop
        
    heappush(heap, time[i][1])	# 최소힙에 다음 강의의 끝나는 시각을 넣어줌
print(len(heap))	# 강의실이 필요한 수업들이 들어있는 힙 요소의 개수를 출력 

0개의 댓글