한 개의 회의실이 있는데 이를 사용하고자 하는 n개의 회의들에 대하여 회의실 사용표를 만들 려고 한다. 각 회의에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하 면서 회의실을 사용할 수 있는 최대수의 회의를 찾아라. 단, 회의는 한번 시작하면 중간에 중 단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다.
▣ 입력설명
첫째 줄에 회의의 수 n(1<=n<=100,000)이 주어진다. 둘째 줄부터 n+1 줄까지 각 회의의 정 보가 주어지는데 이것은 공백을 사이에 두고 회의의 시작시간과 끝나는 시간이 주어진다.
▣ 출력설명
첫째 줄에 최대 사용할 수 있는 회의 수를 출력하여라.
5
1 4
2 3
3 5
4 6
5 7
3
[내 코드]
N=int(input())
a=[list(map(int,input().split())) for _ in range(N)]
a.sort(key=lambda x:x[1])
time=0
cnt=0
for i in range(0,N):
if time<=a[i][0]:
cnt+=1
time=a[i][1]
print(cnt)
- 먼저 탐욕알고리즘을 이용하여 3가지 생각을 구성했다
1.회의시작 시간이 빠른 것으로 정렬
2.회의시간의 시작시간과 종료시간의 차이가 작은 것 순서로 정렬
3.회의시간의 종료시간이 빠른 것으로 정렬
1번의 문제점 : 최적의 해를 찾을 수 없다.
2번의 문제점 : 차이가 적다고 회의가능한 수가 증가하지는 않는다.- 3번의 알고리즘을 택해 우선 a리스트의 회의 종료시간을 기준으로 오름차순 정렬
- for문에서 a리스트의 첫 번째 값의 끝나는 시간을 time으로 삽입되고 a리스트값에 있는 다음 요소의 2열 즉, 끝나는 시간이 time보다 크거나 같을때만 cnt 카운팅과 함꼐 time값 업데이트.
[해설코드]
n=int(input())
meeting=[]
for i in range(n):
s,e=map(int,input().split())
meeting.append((s,e))
meeting.sort(key=lambda x : (x[1],x[0]))
//(x[1],x[0]) x[1]이 우선순위, x[0]이 그다음 순위
endtime=0
cnt=0
for s,e in meeting:
if s>=endtime:
et=e
cnt+=1
print(cnt)