Python/백준

1931_회의실 배정...반례?

728x90

문제는 더보기!

 

더보기
더보기

문제

한 개의 회의실이 있는데 이를 사용하고자 하는 N개의 회의에 대하여 회의실 사용표를 만들려고 한다. 각 회의 I에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 회의의 최대 개수를 찾아보자. 단, 회의는 한번 시작하면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다. 회의의 시작시간과 끝나는 시간이 같을 수도 있다. 이 경우에는 시작하자마자 끝나는 것으로 생각하면 된다.

입력

첫째 줄에 회의의 수 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N+1 줄까지 각 회의의 정보가 주어지는데 이것은 공백을 사이에 두고 회의의 시작시간과 끝나는 시간이 주어진다. 시작 시간과 끝나는 시간은 231-1보다 작거나 같은 자연수 또는 0이다.

출력

첫째 줄에 최대 사용할 수 있는 회의의 최대 개수를 출력한다.

예제 입력 1 복사

11
1 4
3 5
0 6
5 7
3 8
5 9
6 10
8 11
8 12
2 13
12 14

예제 출력 1 복사

4

 

 

 

동적 계획법을 이용해서 시간을 추가해나갈까.. 하다가 그리디 알고리즘이 분류에 있는걸 보고 생각을 바꾸어서 생각해보았더니 쉽게 풀렸다.

 

회의를 최대한 많이 넣기 위해서는 회의가 끝나는 시간만 생각하면 된다. 즉, 회의가 끝나는 시간대로 정렬하고 처음부터 비교해 나가면서 시작하는 시간이 이전에 끝났던 시간보다 나중의 시간이라면 개수를 세어주면 된다.

 

11
1 4
3 5
0 6
5 7
3 8
5 9
6 10
8 11
8 12
2 13
12 14

 

예시로 준걸 보면 처음이 4로 끝나기 때문에 3 5와 0 6은 될수 없고, 5 7은 시작시간이 5이기때문에 셀 수 있다. 이런식으로 세어 나가면 된다.

 

 

라고 생각하고 풀었는데 백준이 넘어가지 않았다...

 

반례를 찾다보니 어느정도 해결이 되었다.

 

3
1 3
8 8
4 8

 

위와같은 경우에서 끝나는 시간이 같다면 시작하는시간또한 정렬을 해주어야 한다. 그래야 위의 케이스에서 3개로 인식한다. 정렬하는 과정이 없다면 2개로 인식하게 되는 것이다.

 

그래서 먼저 시작하는시간대로 정렬을 해주고, 그 리스트에서 두번째 시간대로 정렬을 해줌으로 위의 경우를 맞춰주었다.

 

import sys
n = int(sys.stdin.readline())
lst = []
for _ in range(n):
    lst.append(list(map(int,sys.stdin.readline().split())))

lst.sort()
lst.sort(key = lambda x : x[1])
count,num = 0,0

for start,end in lst:
    if start >= num :
        count +=1
        num = end

print(count)
728x90

'Python > 백준' 카테고리의 다른 글

1541_잃어버린 괄호  (0) 2022.01.12
11399_ATM  (0) 2022.01.11
11047_동전0  (0) 2022.01.09
12868_평범한 배낭  (0) 2022.01.08
1912_연속합  (0) 2022.01.06