문제 설명
https://www.acmicpc.net/problem/1931
성능 요약
메모리: 46628 KB, 시간: 4280 ms
분류
그리디 알고리즘, 정렬
제출 일자
2024년 3월 24일 03:36:32
문제 설명
한 개의 회의실이 있는데 이를 사용하고자 하는 N개의 회의에 대하여 회의실 사용표를 만들려고 한다. 각 회의 I에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 회의의 최대 개수를 찾아보자. 단, 회의는 한번 시작하면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다. 회의의 시작시간과 끝나는 시간이 같을 수도 있다. 이 경우에는 시작하자마자 끝나는 것으로 생각하면 된다.
입력
첫째 줄에 회의의 수 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N+1 줄까지 각 회의의 정보가 주어지는데 이것은 공백을 사이에 두고 회의의 시작시간과 끝나는 시간이 주어진다. 시작 시간과 끝나는 시간은 231-1보다 작거나 같은 자연수 또는 0이다.
출력
첫째 줄에 최대 사용할 수 있는 회의의 최대 개수를 출력한다.
문제 풀이
그리디 알고리즘 문제
모든 경우의 수를 전부 탐색하면 시간복잡도가 O(2^n)이 되고,
DP를 사용해서 풀면 회의를 정렬해두고 D[i]보다 먼저 끝나는 회의의 D[j]값에서 1을 더하면 되는데, 이것도 이전 회의들을 다 탐색해야 하기 때문에 O(N^2)가 된다.
=> 이 문제는 N의 최대가 100,000이기 때문에 시간복잡도가 너무 크다
따라서 가능한 회의 중에 먼저 끝나는 회의를 선택하는 그리디 알고리즘으로 문제를 해결하면 된다.
끝나는 시간이 빠른 순으로 정렬하고, 만약 끝나는 시간이 같다면 시작 시간이 빠른 순으로 정렬하면 된다.
회의 목록을 끝나는 시간으로 정렬하기 위해 끝나는 시간을 인덱스 0에 넣은 후 리스트(meet)에 추가했다.
정렬 후 회의 목록을 돌면서 현재 시간(time)보다 시작 시간이 작거나 같으면
현재 시간을 선택한 회의의 끝나는 시간으로 저장해가며 회의 개수를 구했다.
N = int(input())
meet = []
for _ in range(N):
s, f = list(map(int, input().split()))
meet.append([f, s])
meet.sort()
time = 0 # 현재 시간
result = 0
for m in meet:
# 시작 시간이 현재 시간보다 작거나 같으면
if time <= m[1]:
time = m[0] # 현재 시간을 선택한 회의의 끝나는 시간으로 저장
result += 1
print(result)
'알고리즘 > 백준' 카테고리의 다른 글
[백준`G4] 1715 - 카드 정렬하기 (Python) (0) | 2024.03.31 |
---|---|
[백준`G5] 15686 - 치킨 배달 (Python) (0) | 2024.03.30 |
[백준`G3] 2638 - 치즈 (Python) (0) | 2024.03.22 |
[백준`G5] 2294 - 동전 2 (Python) (0) | 2024.03.22 |
[백준`S1] 14888 - 연산자 끼워넣기 (Python) (2) | 2024.03.22 |