[알고리즘] 회의실 배정(그리디)
(문제) 회의실 배정(그리디)
한 개의 회의실이 있는데 이를 사용하고자 하는 n개의 회의들에 대하여 회의실 사용표를 만들려고 한다.
각 회의에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 최대수의 회의를 찾아라.
단, 회의는 한번 시작하면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다.
입력설명
첫째 줄에 회의의 수 n(1<=n<=100,000)이 주어진다.
둘째 줄부터 n+1 줄까지 각 회의의 정보가 주어지는데 이것은 공백을 사이에 두고 회의의 시작시간과 끝나는 시간이 주어진다.
출력설명
첫째 줄에 최대 사용할 수 있는 회의 수를 출력하여라.
테스트케이스
입력예제 | 출력예제 |
---|---|
5 1 4 2 3 3 5 4 6 5 7 |
3 |
20 18 19 2 20 4 21 2 22 12 15 12 23 2 8 5 20 22 23 1 5 13 21 16 20 9 19 5 9 14 20 16 22 11 12 4 16 21 23 11 13 |
6 |
예제설명
(2, 3) , (3, 5), (5, 7)이 회의실을 이용할 수 있다.
해결방법
답에 접근하기 위해서는 회의가 끝나는 시간 기준으로 정렬 해야한다.
시작 시간 정렬하면 만약 끝나는 시간이 엄청 늦게 끝나면 정답을 도출할 수 없다.
끝나는 시간을 저장해서 다음 시작 시간과 비교하여 같거나 크면 가능하다.
그러면 밑에 있는 것들도 가능하지 않냐?
밑에 있는게 더 빠를 수 있지 않냐?
하지만 생각을 해보면 우리는 벌써 끝나는 시간으로 정렬하지 않았나!!
이해를 돕기 위해서 예제를 사용하여 한번 해보겠다.
아래와 같이 끝나는 시간 기준으로 정렬 했다!
2 3
1 4
2 5
3 5
4 5
5 7
맨처음 끝나는 시간이 3 이므로 이 3 기준으로 시작하는 시간 3 과 같거나 혹은 큰 것을 찾아야한다.
시작하는 시간 1과 2는 3을 넘지 못하니 버리고, 시작하는 시간 3과 4가 있을 것이다.
둘다 동일한 값이다.
(3, 5)
(4, 5)
이때 필자는 어이없는 생각을 한 적이 있다.
(필자 생각 : 그러면 시작하는 시간 중 4가 3보다 빨리 끝나면요??)
하지만 그럴일이 없다!!
이유는 “이미 우리는 끝나는 시간으로 정렬”을 했기 때문이다.
만약 4가 3 보다 빨리 끝나면 당연히 정렬을 했을 때 4가 3보다 위에 당연히 있을 것이다!!
고로 필자는 빡대가리다 ㅠㅠ 멍청이 … ㅠ
코드
# 시작 시간, 끝 시간 최대수 한번 시작하면 중간에 중단 불가능
n = int(input())
arr = [list(map(int,input().split())) for i in range(n)]
arr.sort(key=lambda x: x[1])
res = -2174000000
count = 0
for i in range(n):
if arr[i][0] >= res:
res = arr[i][1]
count = count + 1
print(count)
댓글남기기