문제
한 개의 회의실이 있는데 이를 사용하고자 하는 N개의 회의에 대하여 회의실 사용표를 만들려고 한다. 각 회의 I에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 회의의 최대 개수를 찾아보자. 단, 회의는 한번 시작하면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다. 회의의 시작시간과 끝나는 시간이 같을 수도 있다. 이 경우에는 시작하자마자 끝나는 것으로 생각하면 된다.
입력
첫째 줄에 회의의 수 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N+1 줄까지 각 회의의 정보가 주어지는데 이것은 공백을 사이에 두고 회의의 시작시간과 끝나는 시간이 주어진다. 시작 시간과 끝나는 시간은 231-1보다 작거나 같은 자연수 또는 0이다.
문제 풀이 : 이 문제는 그리디 알고리즘을 이용하는 문제이다.
"회의실을 사용할 수 있는 회의의 최대 개수" 라는 욕심 즉, 최적해를 구하는 문제이다.
여기서 중요한 것은 "회의는 한번 시작하면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다. 회의의 시작시간과 끝나는 시간이 같을 수도 있다." 라는 것인데, 이것은 시작시간과 끝나는 시간이 2개의 같은 중복된 회의시간이 주어진다면, 둘다 선택될 수 있음을 뜻하며 또한 이전의 회의 끝나는 시간과 이후의 회의 시작하는 시간이 같아도 된다는 의미이다.
이럴경우 주어진 회의 시간들을 리스트와 같은 객체에 담아, 빨리 끝나는 회의 순서대로 정렬을 해야 한다.
빨리 끝날수록 더 많은 회의 시간들을 가질 수 있기때문이다.
자 그렇게 된다면, 정렬의 우선순위는 1. 회의가 끝나는 시간, 2. 회의가 시작하는 시간이다.
이제 고려할 것은 이것을 어떻게 코드로 구현할 것인가 이다.
나의 경우 파이썬의 튜플과 맵을 사용하였다.
또한 정렬은 key에 튜플로 인자값을 주어 값을 받아옴과 동시에 해당 인자의 순서대로 정렬을 사용하였다.
파이썬 문법에 대해서는 설명을 쓰지않겠다.
내 소스 코드:
1
2
3
4
5
6
7
8
9
10
11
|
numberOfMeeting = int(input())
time = sorted([tuple(map(int, input().split()))for _ in range(numberOfMeeting)], key = lambda x:(x[1],x[0]))
answer = end = 0
for start_time, end_time in time :
if start_time >= end:
answer += 1
end = end_time
print(answer)
|
cs |
GIT 주소 : https://github.com/ois0886/BJ_Python/blob/main/BJ_1931.py
'BaekJoon' 카테고리의 다른 글
[백준 알고리즘] 1541번 : 잃어버린 괄호 (Python) 문제 풀이 (0) | 2022.08.08 |
---|---|
[백준 알고리즘] 1026번 : 보물 (Python) 문제 풀이 (0) | 2022.08.04 |
[백준 알고리즘] 1002번 : 터렛 (C++) 문제 풀이 (0) | 2021.09.06 |
[백준 알고리즘] 2609번 : 최대공약수와 최소공배수 (C++) 문제 풀이 (0) | 2021.08.30 |
[백준 알고리즘] 1427번 : 소트인사이드 (JAVA) 문제 풀이 (0) | 2021.08.25 |