Algorithm/acmicpc.net
알고리즘 잘 푸는법 : 문제 이해가 우선 (실버2)
winney916
2022. 3. 8. 23:34
728x90
#1931번 회의실 배정 https://www.acmicpc.net/problem/1931
1931번: 회의실 배정
(1,4), (5,7), (8,11), (12,14) 를 이용할 수 있다.
www.acmicpc.net
회의 시작 시간과 종료 시간이 주어지면, 최대한 많은 회의를 진행하는 경우에 몇 개의 회의를 진행할 수 있는지를 출력하면 된다.
처음에 나는 모든 경우의 수를 다 계산하려 했다.
근데 시간초과가 났다. 여러 방법을 추가했지만 시간초과였다.
정답은 굉장히 단순했다.
그냥 정렬하고 순서대로 계산하면 된다.
task = [list(map(int, input().split())) for _ in range(int(input()))]
task = sorted(task, key=lambda a: a[0])
task = sorted(task, key=lambda a: a[1])
last = 0
cnt = 0
for i, j in task:
if i >= last:
cnt += 1
last = j
print(cnt)
회의 시작시간을 기준으로 정렬한 뒤
회의 종료시간을 기준으로 한번 더 정렬한다.
그 뒤에 계산하면 된다.
이렇게 간단하다는 사실에 좀 충격이었다.
시작시간으로만 정렬하면, 일찍 시작하고 늦게 끝나는 회의로 인해 시간을 독식당할 수 있다.
종료시간만으로 정렬하면, 에초에 늦게 시작하게된다.
시작시간으로 정렬한 뒤 종료시간으로 정렬하게되면 위 두 가지 방법이 지닌 각각의 문제점을 중철시킨
좋은 방법이 된다.
사실 아직도 납득이 안된다.
+) sorted함수는 정렬을 하는데, key인자를 받는다. lambda함수를 통해 리스트 내 인덱스를 전달할 수 있다.