[알고리즘]회의실 배정

김도연·2024년 1월 13일

알고리즘

목록 보기
25/56

문제

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

▣ 입력설명
첫째 줄에 회의의 수 n(1<=n<=100,000)이 주어진다. 둘째 줄부터 n+1 줄까지 각 회의의 정 보가 주어지는데 이것은 공백을 사이에 두고 회의의 시작시간과 끝나는 시간이 주어진다.

▣ 출력설명
첫째 줄에 최대 사용할 수 있는 회의 수를 출력하여라.

입력예제1

5
1 4
2 3
3 5
4 6
5 7

출력예제1

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)
  1. 먼저 탐욕알고리즘을 이용하여 3가지 생각을 구성했다

    1.회의시작 시간이 빠른 것으로 정렬
    2.회의시간의 시작시간과 종료시간의 차이가 작은 것 순서로 정렬
    3.회의시간의 종료시간이 빠른 것으로 정렬
    1번의 문제점 : 최적의 해를 찾을 수 없다.
    2번의 문제점 : 차이가 적다고 회의가능한 수가 증가하지는 않는다.

  2. 3번의 알고리즘을 택해 우선 a리스트의 회의 종료시간을 기준으로 오름차순 정렬
  3. 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)

0개의 댓글