한 개의 회의실이 있는데 이를 사용하고자 하는 N개의 회의에 대하여 회의실 사용표를 만들려고 한다. 각 회의 i에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 회의의 최대 개수를 찾아보자. 단, 회의는 한번 시작하면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다. 회의의 시작시간과 끝나는 시간이 같을 수도 있다. 이 경우에는 시작하자마자 끝나는 것으로 생각하면 된다.
N(1 ≤ N ≤ 100,000)이 주어진다.N+1 줄까지 각 회의의 정보가 주어진다.2^31 - 1보다 작거나 같은 자연수 또는 0이다.N = int(input())
a = []
for _ in range(N):
a.append(tuple(map(int, input().split())))
a.sort()
next_idx = N
cnt = 1
i = 0
while True:
if i == next_idx:
cnt += 1
next_idx = N
if i == N - 1:
break
for j in range(i+1, N):
if a[i][1] <= a[j][0] and j < next_idx:
next_idx = j
i += 1
break
if j == N - 1:
i += 1
print(cnt)
시간 초과 문제를 해결하기 위해 이중 반복문을 제거하고, 한 번의 순회로 해결할 방법을 고민했다.
이 방식은 정렬 후 한 번의 순회만 진행하기 때문에 시간 복잡도는 O(N log N) + O(N) = O(N log N)으로 감소한다.
import sys
input = sys.stdin.readline
N = int(input())
a = []
for _ in range(N):
a.append(tuple(map(int, input().split())))
a.sort()
cnt = 1
m = a[0][1]
for i in range(1, N):
if m <= a[i][0]:
cnt += 1
m = a[i][1]
if a[i][1] < m:
m = a[i][1]
print(cnt)
| 접근 방식 | 시간 복잡도 | 이유 |
|---|---|---|
| 기존 코드 | O(N^2) | 모든 회의를 비교하여 겹치는지 확인 |
| 개선된 코드 | O(N log N) | 정렬 후 한 번의 순회만 수행 |