728x90
반응형
SMALL
문제
한 개의 회의실이 있는데 이를 사용하고자 하는 N개의 회의에 대하여 회의실 사용표를 만들려고 한다. 각 회의 I에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 회의의 최대 개수를 찾아보자. 단, 회의는 한번 시작하면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다. 회의의 시작시간과 끝나는 시간이 같을 수도 있다. 이 경우에는 시작하자마자 끝나는 것으로 생각하면 된다.
풀이
- 본인은 이 문제를 보자마자 그리디 알고리즘을 떠올렸다.
- 하지만 본인이 고민했던 것에는 2개가 있다.
- 시작 시점이 빠른 것으로 정렬을 하고 이를 기점으로 끝나는 시간을 비교해서 가능한 회의의 갯수를 세어야 할까?
- 끝나는 시점이 빠른 것으로 정렬을 하고 이를 기점으로 끝나는 시간을 비교해서 가능한 회의의 갯수를 세어야 할까?
- 결론은 끝나는 시간이었다. => 시작 시점이 빠른 것으로 정렬을 했을 때, 시작하는 시간이 가장 빠르고 가장 늦게 끝날 경우 1개의 회의만 가능하게 됨으로 우리가 원하는 구상, 원하는 동작을 하지 않는다.
- 따라서 끝나는 시점을 기점으로 최대한 많은 회의를 넣어주어야 한다.
import sys
input = sys.stdin.readline
N = int(input())
refer = [list(map(int, input().split())) for _ in range(N)]
refer.sort(key=lambda x : [x[1], x[0]])
ans = [refer[0]]
for i in range(N-1):
if ans[-1][1] <= refer[i+1][0]:
ans.append(refer[i+1])
print(len(ans))
- refer라는 배열에는 각 회의의 시작 시각, 끝나는 시각이 담여있다. ( [[1,2],[3,4],[5,6],....) 이런 형태이다.
- 이렇게 입력받은 refer라는 배열을 sort() 함수와 lambda 식을 사용하여 끝나는 시간 (코드에서는 x[1])을 기점으로 정렬 하고자 한다.
- ans에 가장 처음에 있는 회의, 즉 무조건 시작하는 회의를 하나 넣어주고, 그다음 for문을 통해 refer에 있는 회의들을 하나씩 순회하면서 if문(끝나는 시각이 다음회의의 시작하는 시각보다 빨리 끝나는지) 확인하고 그렇다면 ans 배열에 추가
- if문에서는 ans에 들어있는 가장 마지막 원소의 끝나는 시점을 보고자 한다.
- 그리고 ans배열의 원소의 갯수가 가능한 모든 회의의 갯수가 될 것이다.
728x90
반응형
LIST
'알고리즘 && 자료구조 > 백준' 카테고리의 다른 글
[백준 11399] ATM (Feat. Java) (1) | 2024.02.14 |
---|---|
[백준 11659] 구간 합 구하기 4(Feat.Python) (1) | 2024.01.22 |
[백준 11047] 동전 0 (Feat.Python) (0) | 2024.01.18 |
[백준 17608] 막대기(Feat.Python) (0) | 2024.01.17 |
[백준 2798] 블랙잭(Feat.Python)[Combination] (0) | 2024.01.16 |