Notice
Recent Posts
Recent Comments
Link
Love Every Moment
〔백준/파이썬〕1931번 회의실 배정 본문
반응형
출처
문제
한 개의 회의실이 있는데 이를 사용하고자 하는 N개의 회의에 대하여 회의실 사용표를 만들려고 한다. 각 회의 I에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 회의의 최대 개수를 찾아보자. 단, 회의는 한번 시작하면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다. 회의의 시작시간과 끝나는 시간이 같을 수도 있다. 이 경우에는 시작하자마자 끝나는 것으로 생각하면 된다.
첫째 줄에 회의의 수 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N+1 줄까지 각 회의의 정보가 주어지는데 이것은 공백을 사이에 두고 회의의 시작시간과 끝나는 시간이 주어진다. 시작 시간과 끝나는 시간은 231-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
풀이
# 회의의 수
N = int(input())
# 회의 정보: [(시작시간, 종료시간), (시작시간, 종료시간), ... ]
info = list()
for i in range(N) :
time = tuple(map(int, input().split()))
info.append(time)
# 시작 시간이 빠른 순으로 정렬
info.sort(key = lambda x : x[0])
# 종료 시간이 빠른 순으로 정렬
info.sort(key = lambda x : x[1])
# 직전 회의 종료 시간
last = 0
# 회의 개수
count = 0
for s, e in info :
if s >= last :
last = e
count += 1
print(count)
- 예를 들어 회의 시간이 (0, 4), (1,3), (3, 5) 이렇게 주어진다면 (1,3), (3,5) 이렇게 선택해야 한다
- 그러려면 회의 시작 시간과 종료 시간을 모두 고려하여야 하므로 이에 따라 오름차순으로 정렬한다
- 먼저 회의 시작 시간을 기준으로 정렬한 다음 종료 시간으로 다시 정렬하면 (2,4), (1,4) 와 같이 주어지는 경우 (1,4) (2,4) 의 순으로 정렬되게 할 수 있다
- 기본적인 아이디어는 직전 회의 종료 시간 이후로 시작하는 회의 중에서 가장 빨리 종료되는 것을 고르는 것이다
info.sort(key = lambda x : (x[1], x[0]))
- 이렇게 한 번에 정렬하는 방법도 있다
노트
- sort() 는 기본적으로 오름차순으로 정렬하는 기능을 하지만, 인자로 key 또는 reverse 를 넘겨줌으로써 다른 기준에 따라 정렬할 수 있다
- (1) reverse: info.sort(reverse=True) 처럼 사용하여 내림차순으로 정렬
- (2) key: info.sort(key = 함수) 처럼 사용하여 어떤 기준으로 정렬할 것인지를 알려준다
- 여기서 사용한 람다함수(lambda) 는 익명함수로, 간결하게 함수를 작성하게 해준다
- 여기서는 이용하지 않았지만 filter() 함수를 이용하여 푸는 방법도 있다
- 아래는 "k 보다 큰 요소 중에 가장 작은 것"을 찾는 방법을 소개한 글이다
- min(filter(lambda i : i > k, test_list)) 처럼 사용
반응형
'PROGRAMMING::LANGUAGE > Python' 카테고리의 다른 글
〔파이썬〕클래스란? 클래스, 인스턴스, 속성, 메서드 사용법 (0) | 2022.06.30 |
---|---|
〔백준/파이썬〕13305번 주유소 (0) | 2022.06.29 |
〔백준/파이썬〕1157번 단어 공부 (0) | 2022.06.25 |
〔백준/파이썬〕2675번 문자열 반복 (0) | 2022.06.24 |
〔백준/파이썬〕10809번 알파벳 찾기 (0) | 2022.06.24 |
Comments