lambda key를 이용한 sort  

 

문제

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

나의 풀이

끝나는 시간과 시작하는 시간을 차례로 정렬한 후 가능한 예약시간이 등장할 때마다 카운트를 늘려주는 식으로 해결할 수 있습니다.

일정이 빠르게 끝날 수록 뒤에 여유 시간이 많아져 추가일정을 더 많이 넣을 수 있습니다.
같은 시간에 끝나는 경우 가능한 일정 중 가장 빨리 시작할 수 있는 일정을 집어 넣어야 합니다. 이렇게 구현해야 동일시간에 시작하고 끝나는 일을 놓치지 않고 처리할 수 있습니다.

사용된 개념 중 참고할 만한 것은 sort의 key로 lambda 함수를 사용했다는 것입니다. 파이썬에서 lambda를 사용하면 다중조건으로 한번에 정렬을 완료할 수 있습니다. 참고 사이트

lambda 식을 사용하는 더 많은 예제는 이곳을 들어가면 보실 수 있습니다.

import sys

read = lambda: sys.stdin.readline().strip()

N = int(read())
time = [[0] * 2 for _ in range(N)]

for i in range(N):
    s, e = map(int, read().split())
    time[i][0] = s
    time[i][1] = e
# 람다식을 이용해 tuple을 생성하고 key로 설정해줍니다. 
time.sort(key=lambda x: (x[1], x[0]))

cnt = 1
last_end_time = time[0][1]
for i in range(1, N):
    if time[i][0] >= last_end_time:
        cnt += 1
        last_end_time = time[i][1]

print(cnt)

댓글남기기