백준 1931번 - 회의실 배정

회의실 배젇 문제 바로 가기

풀이 날짜: 2026-01-14

baekjoon 알고리즘 문제 풀이

풀이 코드


import sys
input = sys.stdin.readline

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

for _ in range(n):
    start, end = map(int, input().split())
    times.append((start, end))
times.sort(key=lambda x: (x[1], x[0]))

count = 0
end_time = 0

for start, end in times:
    if start >= end_time:
        count+=1
        end_time = end

print(count)  

문제 핵심 요약:

해결 전략을 세우며 가장 먼저 고민한 것은 “어떤 회의를 먼저 선택해야 이후 선택의 폭이 넓어질까”였다.

이 질문에 대한 답은 회의의 시작 시간이 아니라 끝나는 시간에 있었다. 빨리 끝나는 회의를 먼저 선택할수록 다음 회의를 배치할 수 있는 시간이 많아지고, 그 결과 더 많은 회의를 선택할 수 있다고 판단했다.

이 순간, 이 문제가 그리디 알고리즘이라는 확신이 들었다.


정렬 기준을 결정

끝나는 시간을 기준으로 정렬한다는 아이디어는 비교적 빠르게 떠올랐지만, 그 자체로는 충분하지 않다는 점을 구현 과정에서 깨달았다.

끝나는 시간이 같은 회의가 여러 개 존재할 수 있고, 이 경우 어떤 회의를 먼저 고려하느냐에 따라 이후 선택 가능 여부가 달라질 수 있었다.

그래서 정렬 기준을 다음과 같이 정리했다.

  • 1차: 끝나는 시간
  • 2차: 시작 시간

조건 확인

매 반복마다

  • 현재 회의의 시작 시간이
  • 마지막 회의의 종료 시간 이후인지

이 조건만 확인해 회의를 선택했다.


구현 과정에서 겪은 어려움

처음에는 “끝나는 시간만 정렬하면 충분하지 않을까?”라는 생각을 했지만, 반례를 통해 그 생각이 틀렸다는 것을 확인했다.

이 경험을 통해 그리디 문제에서는 조건이 하나라도 빠지면 최적해가 보장되지 않는다는 점을 다시 한 번 체감했다.