백준 1931번 회의실 배정
https://www.acmicpc.net/problem/1931
문제
한 개의 회의실이 있는데 이를 사용하고자 하는 N개의 회의에 대하여 회의실 사용표를 만들려고 한다. 각 회의 I에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 회의의 최대 개수를 찾아보자. 단, 회의는 한번 시작하면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다. 회의의 시작시간과 끝나는 시간이 같을 수도 있다. 이 경우에는 시작하자마자 끝나는 것으로 생각하면 된다.
입력
첫째 줄에 회의의 수 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N+1 줄까지 각 회의의 정보가 주어지는데 이것은 공백을 사이에 두고 회의의 시작시간과 끝나는 시간이 주어진다. 시작 시간과 끝나는 시간은 231-1보다 작거나 같은 자연수 또는 0이다.
출력
첫째 줄에 최대 사용할 수 있는 회의의 최대 개수를 출력한다.
문제 유형
그리디 알고리즘
정렬
풀이 방법 도출
하나의 회의실에서 최대한 많은 회의를 진행해야 합니다.
회의가 끝나는 시간과 동시에 새로운 회의가 시작될 수 있습니다.
회의 시간이 겹치지 않도록 가장 많은 회의를 선택해야 합니다.
- 입력받은 회의들을 (시작 시간, 종료 시간) 형태로 저장합니다.
- 회의 종료 시간을 기준으로 정렬합니다.
- 가장 빨리 끝나는 회의를 먼저 선택하고, 현재 회의의 시작 시간이 이전 회의 종료 시간 이후라면 회의가 진행 가능합니다. 선택한 회의의 개수 증가와 종료 시간을 업데이트 합니다.
- 최대 사용할 수 있는 회의 개수 출력합니다.
시간 복잡도
- 정렬 단계: O(N log N)
- 반복문 순회(그리디 선택) : O(N)
- 총 시간 복잡도: O(N log N)
핵심 코드 삽입 및 설명
import sys
input = sys.stdin.readline
# 입력받기
n = int(input()) # 회의의 개수
meetings = []
# 회의 정보 입력받기
for _ in range(n):
start, end = map(int, input().split())
meetings.append((start, end))
# 회의 종료 시간을 기준으로 정렬 (같다면 시작 시간을 기준으로 정렬)
meetings.sort(key=lambda x: (x[1], x[0]))
# 그리디디 알고리즘을 이용하여 최대 회의 개수 구하기
count = 0 # 선택한 회의 개수
last_end_time = 0 # 마지막으로 선택한 회의의 종료 시간
for start, end in meetings:
if start >= last_end_time: # 이전 회의 종료 이후에 시작되는 회의만 선택
count += 1
last_end_time = end # 현재 선택한 회의의 종료 시간 업데이트
# 결과 출력
print(count)
'Study > 코딩 테스트' 카테고리의 다른 글
[백준] 7576번 토마토 해설 및 풀이 (Python) (0) | 2025.03.10 |
---|---|
[백준] 16953번 A → B 해설 및 풀이 (Python) (0) | 2025.03.08 |
[백준] 2343번 기타 레슨 해설 및 풀이 (Python) (0) | 2025.03.07 |
[백준] 9935번 문자열 폭발 해설 및 풀이 (Python) (0) | 2025.03.07 |
[백준] 12891번 DNA 비밀번호 해설 및 풀이 (Python) (0) | 2025.03.05 |