파이썬 코딩테스트 강좌, 회의실 배정하기

문제 설명

회의실 배정 문제는 여러 개의 회의가 주어진 경우, 각 회의의 시작 시간과 종료 시간을 바탕으로 회의실을 최적으로 배정하는 문제입니다. 주어진 회의가 겹치는 경우는 회의실을 추가로 배정해야 하므로, 이러한 경우를 피하면서 최대한 많은 회의를 진행할 수 있도록 배정하는 것이 목표입니다.

문제 정의

주어진 회의의 시작 시간과 종료 시간을 리스트 형태로 입력받아, 회의실 배정을 통해 몇 개의 회의를 동시에 진행할 수 있는지를 계산하세요.

입력 형식

[[시작시간1, 종료시간1], [시작시간2, 종료시간2], ...]
    

출력 형식

가능한 최대 회의 수
    

예시

입력: [[1, 3], [2, 4], [3, 5], [6, 8]]
출력: 3
    

문제 풀이 과정

이 문제는 그리디 알고리즘을 사용하여 해결할 수 있습니다. 각 회의의 종료 시간을 기준으로 회의를 정렬한 후, 가장 먼저 끝나는 회의를 선택하고 그 다음 회의가 끝나는 시간과 겹치지 않도록 선택하는 방식입니다.

1단계: 데이터 정리

먼저 주어진 회의 리스트를 종료 시간을 기준으로 정렬합니다. 이렇게 함으로써 가장 적게 자원을 소모하면서 회의를 진행할 수 있습니다.

2단계: 회의 참석 가능한지 판단

정렬된 회의 리스트에서 첫 번째 회의를 선택하고, 다음 회의가 이 회의의 종료 시간보다 크거나 같을 경우 그 회의를 선택합니다. 이러한 과정을 반복하여 최대한 많은 회의를 선택합니다.

3단계: 구현

이제 위의 과정을 바탕으로 파이썬 코드를 구현해보겠습니다.

python
def max_conferences(conferences):
    # 회의 리스트를 종료 시간을 기준으로 정렬
    conferences.sort(key=lambda x: x[1])
    
    # 첫 번째 회의 선택
    count = 1
    last_end_time = conferences[0][1]
    
    # 나머지 회의들에 대해 반복
    for i in range(1, len(conferences)):
        if conferences[i][0] >= last_end_time:  # 시작 시간이 마지막 회의 종료 시간보다 크거나 같으면
            count += 1
            last_end_time = conferences[i][1]  # 마지막 회의 종료 시간 업데이트
    
    return count

# 예시 입력
meetings = [[1, 3], [2, 4], [3, 5], [6, 8]]
result = max_conferences(meetings)
print("최대 회의 수:", result)
    

4단계: 코드 설명

코드 설명

  • 정렬: 첫 번째 줄 where `conferences.sort(key=lambda x: x[1])`는 각 회의 끝나는 시간 기준으로 리스트를 정렬합니다.
  • 회의 선택: 이후 반복문을 통해 각 회의가 마지막으로 선택된 회의가 끝난 후 시작되는지 확인하여 선택합니다.
  • 결과 리턴: 최종적으로 선택된 회의 수를 리턴합니다.

5단계: 복잡도 분석

이 알고리즘의 시간 복잡도는 정렬에 O(n log n), 회의를 선택하는 데 O(n)이므로 총 O(n log n)의 복잡도를 가집니다. 공간 복잡도는 O(1)입니다.

6단계: 추가 연습 문제

이 문제를 통해 그리디 알고리즘의 기본 개념을 익힌 후, 다양한 추가 연습 문제를 풀어 보면 좋습니다. 예를 들어:

  • 회의의 시작 시간과 종료 시간이 임의의 범위에서 주어질 때, 가장 적은 회의실 수로 모든 회의를 진행할 수 있는가?
  • 회의실을 예약하는 시스템을 구현하여 사용자가 직접 회의를 추가하고 확인할 수 있는 프로그램을 만들어보세요.

결론

이번 강좌에서 “회의실 배정하기” 문제를 통해 그리디 알고리즘을 적용한 문제를 해결하는 방법에 대해 알아보았습니다. 이를 바탕으로 알고리즘 문제 해결 능력을 기르는 데 많은 도움이 되기를 바랍니다. 다음 강좌에서는 더욱 다양한 알고리즘 문제를 다뤄보겠습니다.

참고 자료