코딩테스트

[백준][Python] 1931번 회의실 배정 문제 해설, 정답코드 (그리디 알고리즘)

EEEUN 2022. 10. 8. 22:10

 

❗ 문제 접근법, 아이디어

1. 회의가 빨리 끝날수록 뒤에 더 많은 회의를 할 수 있다.

2. 회의가 끝나는 시간이 같다면, 회의 시작 시간이 빠른 회의가 우선된다.

 

2번이 무슨 소리냐면,

# 1시에 시작하고 8시에 끝나는 회의, 8시에 시작하고 8시에 끝나는 회의
(1, 8) (8, 8)

이렇게 두 회의가 있을 때 (1, 8) (8, 8) 순서로 두면 두 회의를 다 진행할 수 있지만,

(8, 8) (1, 8) 순서로 두면 앞에 있는 회의 1개만 진행할 수 있다.

 

그래서 회의 시간을 정렬할 때,

끝나는 시간 순으로 정렬하고 시작하는 시간 순으로 두 번 정렬해야 한다.

# 끝나는 시간 기준으로 정렬하고 시작하는 시간 기준으로 정렬
arr.sort(key=lambda x: (x[1], x[0]))

arr은 회의 시간을 담은 리스트이다.

파이썬의 sort() 함수는 key 매개변수를 사용하면 '특정한 데이터 기준'으로 정렬할 수 있다.

 

>> 고로 그리디 알고리즘 사용!!

가장 회의가 빨리 끝나는 시간을 선택한다는 점에서 "현재 상황에서 가장 최선의 선택"을 하는 그리디 알고리즘이 적용된다고 볼 수 있다.

 

❗ 정답 코드

import sys

n = int(sys.stdin.readline())
arr = []
for _ in range(n) :
    a,b = map(int, sys.stdin.readline().split())
    arr.append([a,b])

arr.sort(key=lambda x: (x[1], x[0]))

count = 0
last = 0
for a,b in arr :
    if a >= last :
        count += 1
        last = b

print(count)

회의가 끝나는 시간을 last로 두고

last보다 큰 최소한의 회의 시작 시작(=a)가 있다면

count를 1 올리는 식으로 풀면 된다.