[BOJ] 11000. 강의실 배정

애이용·2021년 2월 6일
0

BOJ

목록 보기
30/58
post-thumbnail

11000. 강의실 배정

문제

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

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

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

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

입력

첫 번째 줄에 N이 주어진다. (1 ≤ N ≤ 200,000)

이후 N개의 줄에 Si, Ti가 주어진다. (1 ≤ Si < Ti ≤ 109)

출력

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

  1. 먼저 강의의 시작시간을 기준으로 정렬을 한다(sort() 함수 이용)
  2. 끝나는 시간의 최솟값과 주어진 강의의 시작 시간을 비교한다
    (끝나는 시간의 최솟값을 비교하는 이유
    : 끝나는 시간의 최솟값보다 시작 시간이 빠르다면 다른 강의실의 강의들 또한 겹치기 때문)
    2-1. 시작시간이 더 빠른 경우 : heappush()
    2-2. 끝나는 시간의 최솟값이 더 빠른 경우 : heappop() -> heappush()

heapq 라이브러리를 이용한 코드


import sys
import heapq

input = sys.stdin.readline
n = int(input())
lessons = []
for _ in range(n):
  s, t = map(int, input().split())
  lessons.append((s, t))

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

arr = [] # 끝나는 시간 배열
for lesson in lessons:
  s, t = lesson
  if arr and arr[0] <= s: 
    # 끝나는 시간의 최솟값이 시작시간보다 빠른 경우, 
    # 최솟값을 갱신하기 때문에, 최솟값을 pop한 후
    # push
    heapq.heappop(arr)
  heapq.heappush(arr, t)
  print(s, t, arr)

print(len(arr))

heapq 라이브러리 사용 - 힙 자료구조

heapq 라이브러리는 원소로 튜플을 입력받으면, 튜플의 첫번째 원소를 기준으로 우선순위 큐를 구성한다

힙에 원소 추가: heapq.heappush(리스트명, 원소) -> 리스트에 원소를 추가
힙의 원소 삭제: heapq.heappop(리스트명) -> 리스트에서 가장 작은 원소를 삭제

시간 초과 케이스

import sys

input = sys.stdin.readline
n = int(input())
lessons = []
for _ in range(n):
  s, t = map(int, input().split())
  lessons.append((s, t))

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

arr = [0] # 끝나는 시간 배열
for lesson in lessons:
  s, t = lesson
  if min(arr) <= s: # 시작 시간이 겹치지 않는 경우
      arr.remove(min(arr))
  arr.append(t)
  print(s, t, arr)

print(len(arr))

min 함수를 이용해서 배열의 최솟값과, 주어진 lesson의 시작시간을 비교하였다.
하지만 이 방식을 시간초과 케이스가 뜬다.

heapq... 익숙해지자구 ,, !


210222 복습
또 못 떠올렸다 흑


210705 복습

import sys
import heapq

input = sys.stdin.readline 

arr = []
n = int(input())
for _ in range(n):
  s, t = map(int, input().split())
  arr.append((s, t))

arr.sort()

q = []

for i in arr:
  if not q:
    heapq.heappush(q, i[1])
  elif i[0] >= q[0]: # 강의실 새로 배정 안해도 되는 경우 
    heapq.heappop(q)
    heapq.heappush(q, i[1])
  else: # 새로 배정하는 경우
    heapq.heappush(q, i[1])
  
print(len(q))

바로 통과

profile
로그를 남기자 〰️

0개의 댓글