회의실 배정

bird.j·2021년 7월 24일
0

백준

목록 보기
10/76

백준 1931

한 개의 회의실을 N개의 회의에 대하여 겹치지 않고 사용할 수 있는 최대 회의 개수 구하기.

  • 회의는 한번 시작하면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다.
  • 회의의 시작시간과 끝나는 시간이 같을 수도 있다. 이 경우에는 시작하자마자 끝나는 것으로 생각하면 된다.
  • 첫째 줄에 회의의 수 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N+1 줄까지 각 회의의 정보가 주어지는데 이것은 공백을 사이에 두고 회의의 시작시간과 끝나는 시간이 주어진다.
  • 시작 시간과 끝나는 시간은 2^31-1보다 작거나 같은 자연수 또는 0이다.

입출력

입력출력
11
1 4
3 5
0 6
5 7
3 8
5 9
6 10
8 11
8 12
2 13
12 14
4


접근 방식

: (시작 시간, 끝나는 시간)을 리스트에 저장하고 끝나는 시간 기준으로 오름차순 정렬한다.
첫번째 원소의 끝나는 시간을 변수에 담고 리스트를 돌면서 시작 시간이 설정한 끝나는 시간보다 크거나 같으면 그 원소의 끝나는 시간으로 업데이트하고 카운트를 업한다. --> 틀렸습니다.

알게된 점

끝나는 시간이 같은 경우도 고려해주어야한다.
만약 끝나는 시간이 같다면 빨리 시작하는 순서대로 정렬이 되어야 한다.
예를 들어,
2
2 2
1 2
의 경우, 이 상태로라면 (2,2)만 해당하여 1번 회의가 가능하다고 나오지만 정렬을 통해 (1 2)가 먼저 선택되면 (2 2)도 선택이 가능해지기 때문에 2번 회의가 가능하다.
따라서 끝나는 시간의 오름차순, 시작하는 시간의 오름차순으로 정렬해주어야한다!



코드

n = int(input())
graph = []
for _ in range(n):
    s, e = map(int, input().split())
    graph.append((s, e))
graph.sort(key=lambda x : (x[1], x[0]))

e = graph[0][1]
ans = 1
for i in range(1, len(graph)):
    if graph[i][0] >= e:
        ans += 1
        e = graph[i][1]
print(ans)

0개의 댓글