BOJ
[Python 3] BOJ - 1931 "회의실 배정"
PeiSea
2020. 3. 28. 20:21
# 문제 링크 : https://www.acmicpc.net/problem/1931
1931번: 회의실배정
(1,4), (5,7), (8,11), (12,14) 를 이용할 수 있다.
www.acmicpc.net
# 풀이:
개인적으로 이 문제의 핵심은 그리디 알고리즘 문제라는 것과 정렬 기준을 세우는 것이다. 현재 i번째 회의를 선택한다고 하자. 이미 회의의 갯수는 정해져 있으므로 더 많은 회의를 진행하기 위해서는 i의 끝나는 시간과 i + 1의 시작되는 시간의 간격이 크면 클수록 더 많은 회의를 진행할 수 있다. 따라서 빨리 끝나는 회의일 수록 간격이 더 크다. 만일 끝나는 시간이 같다면, 일찍 시작하는 회의일 수록 간격이 더 커져 많은 회의를 진행 할 수 있다. 따라서, 회의를 정렬할 때 우선적으로 끝나는 시간이 빠른 순으로 정렬하되, 끝나는 시간이 같다면 시작하는 시간이 더 이른 순으로 정렬해야 정답을 올바르게 구할 수 있다.
# 코드
import sys, functools
# compare : 첫번째 인자를 오름차순으로, 같다면 두번째 인자를 오름차순으로 정렬하는 함수
def compare(x,y):
if x[1] < y[1]:
return -1
elif x[1] > y[1]:
return 1
else:
if x[0] < y[0]:
return -1
elif x[0] > y[0]:
return 1
else:
return 0
# 입력부
n = int(sys.stdin.readline())
meeting = []
for i in range(n):
start, end = map(int, sys.stdin.readline().split())
meeting.append((start, end))
# 정렬
meeting.sort(key=functools.cmp_to_key(compare))
idx = 0
now_start, now_end = meeting[idx][0], meeting[idx][1]
ans = 1
while idx < len(meeting) - 1:
idx += 1
next_start, next_end = meeting[idx][0], meeting[idx][1]
if next_start >= now_end:
now_start, now_end = next_start, next_end
ans += 1
print(ans)