오늘의 인기 글
최근 글
최근 댓글
Today
Total
05-20 00:00
관리 메뉴

우노

[Greedy] 백준 1931번 “회의실 배정” Python 풀이 본문

Algorithm/Greedy

[Greedy] 백준 1931번 “회의실 배정” Python 풀이

운호(Noah) 2022. 10. 4. 15:38

문제 링크

풀이

  • 주어진 시작 시간과 종료 시간들을 이용해서 가장 많은 회의의 수를 알기 위해서는, 회의가 빨리 끝나는 순서대로 정렬을 진행해야 한다.
    • 회의가 빨리 끝날수록 뒤에서 고려할 수 있는 회의가 많기 때문이다.
    • 만약, 회의가 빨리 시작하는 순서대로 정렬을 진행한다면, 오히려 회의가 늦게 끝날 수도 있다.
  • 또한, 회의가 끝나는 시간이 같을 경우엔, 회의가 빨리 시작하는 순서대로 정렬을 진행해야한다.
    • 예를 들어, 회의가 (2, 2), (1, 2) 순서대로 주어진다면, (2, 2) 회의만 진행할 수 있지만
    • (1, 2), (2, 2) 순서대로 주어진다면, (1, 2), (2, 2) 회의를 모두 진행할 수 있기 때문이다.
  • 따라서, 주어진 회의 시간들을, 회의 종료 시간 기준 오름차순 정렬, 회의 시간 시간 기준 오름차순 정렬하면 된다.
  • 이후, 정렬된 회의 시간들을 탐색하며, 다음 회의 시작 시간이 이전 회의 종료 시간보다 크거나 같다면,
  • 이전 회의 종료 시간을 업데이트하고, 최대 회의 개수를 증가시키면 된다.
  • 알고리즘의 세부 설명은 아래 코드와 같다.

코드

import sys

# 회의의 수
n = int(sys.stdin.readline())

# 회의 시간
meeting_times = []

# 회의의 시작 시간과 끝나는 시간
for _ in range(n):
    start, end = map(int, sys.stdin.readline().split())
    meeting_times.append((start, end))

# 회의 시간을 종료 시간 기준 및 시작 시간 기준으로 정렬
meeting_times = sorted(meeting_times, key = lambda x : (x[1], x[0]))

# 최대 회의 개수
count = 1
# 이전 회의 종료 시간
end_time = meeting_times[0][1]

for i in range(1, n):
    # 다음 회의 시작 시간이 이전 회의 종료 시간보다 크거나 같다면
    if (meeting_times[i][0] >= end_time):
        # 이전 회의 종료 시간 업데이트
        end_time = meeting_times[i][1]
        # 최대 회의 개수 증가
        count += 1

print(count)
Comments