/////
Search
Duplicate

강의실 배정

태그
그리디
체크 필요

문제

김교수는 강의실 1개에 최대한 많은 강의를 배정하려고 한다. 배정된 강의는 서로 겹치지 않아야 하며 수업시간의 길이와 상관없이 최대한 강의를 많이 배정하라.
단, 두 강의의 시작시간과 종료시간은 겹쳐도 된다.

입력

첫 번째 줄에 강의 개수 N이 주어진다. i+1(1iN)i + 1 (1 ≤ i ≤ N)번째 줄에는 i번째 강의의 시작 시간 SiS_i 와 종료 시간 FiF_i가 주어진다.
입력은 다음 조건을 만족한다.
1N1061 ≤ N ≤ 10^6 인 정수
1SiFi1091 ≤ S_i< F_i≤ 10^9

출력

첫 번째 줄에 최대 강의 수를 출력하라.

예시

입력

3 1 3 2 4 3 5
Plain Text
복사

출력

2
Plain Text
복사

정답

import sys import heapq N = int(sys.stdin.readline()) course = [] chosen = [] for _ in range(N): s, f = list(map(int, sys.stdin.readline().split())) heapq.heappush(course, (f,s)) # 힙 자료구조로 저장: 종료 시간을 기준으로 오름차순 정렬해야 하므로 종료 시간을 앞에 둠 current = heapq.heappop(course) answer = 1 # 모든 course를 pop 하면서 확인 while course: tmp = heapq.heappop(course) if tmp[1] >= current[0]: # pop한 course의 시작시간이 마지막 선택된 course의 끝나는 시간보다 늦는 경우 current = tmp # 채택 answer += 1 # 강의 수 +1 print(answer)
Python
복사

풀이

대표적인 Activity-Selection-Problem 이다.
따라서 종료시간이 짧은 순서대로 정렬하고
1.
가장 빨리 끝나는 강의 선택
2.
선택된 강의의 종료시간보다 시작시간이 같거나 큰 강의들 중 가장 빨리 끝나는 강의 선택
을 강의가 남지 않을 때까지 반복하면 된다.
그런데 다른 방식으로 풀면 시간초과가 나기 때문에 힙 자료구조로 풀어야 한다.
강의들을 종료 시간을 기준으로 오름차순 되도록 힙 자료구조로 만들자.
이때 힙 자료구조는 push 되는 원소의 첫 원소를 기준으로 오름차순되기 때문에 (종료시간, 시작시간) 의 형태로 강의들을 힙 자료구조에 넣어준다.
for _ in range(N): s, f = list(map(int, sys.stdin.readline().split())) heapq.heappush(course, (f,s)) # 힙 자료구조로 저장: 종료 시간을 기준으로 오름차순 정렬해야 하므로 종료 시간을 앞에 둠
Python
복사
이제 강의들을 하나씩 pop하면서 pop된 강의의 시작시간이 현재 선택된 강의 시간의 종료 시간보다 같거나 늦으면 현재 강의로 선택하고 강의 수를 + 1 해주는 것을 반복한다.
current = heapq.heappop(course) answer = 1 # 모든 course를 pop 하면서 확인 while course: tmp = heapq.heappop(course) if tmp[1] >= current[0]: # pop한 course의 시작시간이 마지막 선택된 course의 끝나는 시간보다 늦는 경우 current = tmp # 채택 answer += 1 # 강의 수 +1
Python
복사
answer를 print 하면 한 강의실에서 들을 수 있는 최대 강의의 개수가 나온다.