728x90
반응형
https://www.acmicpc.net/problem/1931
1931번: 회의실 배정
(1,4), (5,7), (8,11), (12,14) 를 이용할 수 있다.
www.acmicpc.net
풀이
이 문제를 보고 처음 아래와 같이 코드를 작성했을 때, 각 시간을 arr에 입력 받고 시작시간으로 오름차순 정렬하고 시간이 같을 시, 종료시간을 오름차순으로 정렬했다.
그리고 이중 for문을 돌려 각 인덱스별로 시작했을 때의 최대 회의 수를 count배열에 넣고 max함수를 이용해 최대값을 출력했다. 그러나 시간초과가 발생했다....O(N^2)이라서 그런거같다....그래서 시간복잡도를 어떻게 줄일까 하면서 생각해보았다. 그러다 모든 회의에 대한 최대값을 구할 필요가 없다고 생각이 들었다. 왜냐하면 arr배열을 종료시간으로 우선 오름차순 정렬하고 값이 같을 시, 시작시간으로 오름차순 정렬하면 첫번째 인덱스 값이 종료시간이 가장 빨라 고정이 되기 때문이다. 그래서 밑의 정답코드로 작성하게 되었다.
- 시간초과 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import sys
input=sys.stdin.readline
arr=[]
for _ in range(int(input())):
arr.append(list(map(int,input().split())))
arr.sort(key=lambda x:(x[0],x[1]))
count=[1]*len(arr)
for i in range(len(arr)):
end=arr[i][1]
for j in range(i+1,len(arr)):
if end<arr[j][0]:
end=arr[j][1]
count[i]+=1
print(max(count))
|
cs |
아래의 코드는 가장 빨리 끝나는 회의가 무조건 첫번째가 된다는 것을 중점으로
한번의 for문으로 작성했다. for문의 범위를 지정할 때 1에서부터 시작을 했는데 이유는 첫번째 회의가 시작 시간과 종료 시간이 같을 수 있기 때문에 배제해 주었다. 이렇게 작성하니 시간복잡도가O(N)이다.
- 정답 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import sys
input=sys.stdin.readline
arr=[]
for _ in range(int(input())):
arr.append(list(map(int,input().split())))
arr.sort(key=lambda x:(x[1],x[0]))
cnt=1
end=arr[0][1]
for i in range(1,len(arr)):
if end<=arr[i][0]:
end=arr[i][1]
cnt+=1
print(cnt)
|
cs |
728x90
반응형
'Python3 > 백준 알고리즘' 카테고리의 다른 글
2022.02.15 [백준] (python 파이썬) 신입 사원 (0) | 2022.02.15 |
---|---|
2022.02.15 [백준] (python 파이썬) 모두의 마블 (0) | 2022.02.15 |
2022.02.14 [백준] (python 파이썬) 멀티탭 스케줄링 (0) | 2022.02.14 |
2022.02.14 [백준] (python 파이썬) DNA (0) | 2022.02.14 |
2022.02.14 [백준] (python 파이썬) DFS와 BFS (0) | 2022.02.14 |
댓글