백준 1931: 회의실 배정 | python

유경의 공부방·2022년 3월 28일
0

python

목록 보기
10/13

문제

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

입력

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

출력

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

n=int(input())
time =[]

for i in range(n):
    start, end = map(int, input().split())  #start , end split을 이용해 따로 입력 가능
    time.append([start, end])

time = sorted(time, key = lambda x: x[0]) #start 기준 오름차순 후 end 기준으로 오름차순
time = sorted(time, key = lambda x: x[1])

last = 0 #회의의 마지막 시간을 저장
cnt = 0 #회의 개수를 저장

for i, j in time:
    if i >= last: # 시작시간이 회의의 마지막 시간보다 크거나 같은경우(시작시간 회의시간 같아도 카운트)
        cnt += 1
        last = j  #time 리스트 안의 회의 마지막 시간을 last에 대입

print(cnt)

풀이

회의의 개수를 최대로 해야하므로 회의 시간이 짧은 것부터 수행해야 한다(즉, 오름차순)
회의 개수 n을 입력 받고, time 리스트를 생성한다.

for 반복문을 사용해 2번째 줄 부터 n+1 줄까지 입력되는 숫자들을 map으로 묶는다.
이때, start, end 변수 두 개 동시에 입력 받을 수 있다.
입력받은 값들을 time 리스트에 추가해 준다.

time 리스트를 sorted lambda를 통해서 start 기준으로, end 기준으로 정렬해준다.

lambda : 함수 생성할 때 사용하는 예약어 (def와 비슷)
def를 사용해야 할 정도로 복잡하지 않거나 def 사용 불가능시 사용
lambda는 새 변수 생성이 불가능하여 한 줄 식으로 써야 함(매개변수만 생성)
형태: lambda 매개변수1, 매개변수2, ... : 매개변수를 사용한 식

sorted lambda : key 매개변수를 가지는 sorted() 함수.
key 값을 기준으로 정렬. 기본값은 오름차순

0개의 댓글