백준 : 1379 강의실2
문제 요약
- 총 N개의 강의가 있다.
- 각 강의는 세 가지 정보:
- 강의 번호
- 시작 시간
- 종료 시간
- 겹치는 강의들은 서로 다른 강의실이 필요하다.
- 목표:
- 최소 강의실 개수 출력
- 각 강의마다 배정된 강의실 번호 출력 (강의 번호 순)
문제 분석
이 문제는 전형적인 그리디 + 우선순위 큐 (heapq) 문제입니다.
📌 강의실 배정의 본질
- 겹치지 않는 강의들은 같은 강의실을 사용할 수 있다.
- 가장 먼저 끝나는 강의실부터 체크하면서 빈 방이 있으면 재사용.
- 없다면 새로 방을 배정한다.
📌 주의
- 강의 번호와 강의 순서는 다르다!
- 출력은 강의 번호 순
- 처리 순서는 시작 시간 순
- 따라서 입력을 받아서 → 시작 시간 기준으로 정렬 → 결과는 별도 배열에 저장
최종 코드
import sys, heapq
input = sys.stdin.readline
n = int(input())
lect = []
for _ in range(n):
a, b, c = map(int, input().split())
lect.append((a, b, c))
lect.sort(key=lambda x : (x[1], x[2], x[0]))
room = [0] * n
q = []
count = 0
for i, start, end in lect :
if q and q[0][0] <= start:
end_time, room_num = heapq.heappop(q)
else :
count += 1
room_num = count
room[i-1] = room_num
heapq.heappush(q, (end, room_num))
# print(f"{q} cnt:{count}")
print(count)
for num in room:
print(num)
- 입력 받은 강의 리스트 정렬
- 시작 시간 순으로 정렬
- 시작 시간이 같은 강의는 종료 시간을 기준으로 정렬
- 종료 시간이 같아면, 강의 번호 기준으로 정렬
lect.sort(key=lambda x : (x[1], x[2], x[0]))
- 우선순위 큐 사용
- 힙에는 (종료 시간, 강의실 번호) 형태로 저장
- 현재 강의 시작 시간이 힙의 최소값 (가장 빨리 끝나는 강의) 보다 크면, 해당 방 사용 (pop 후 push)
- 강의실 번호별로 강의실 번호 저장
- 강의 번호 순서대로 출력하기 위해 별도 배열 사용 :
room[ 강의번호 - 1 ]
- 강의 번호 순서대로 출력하기 위해 별도 배열 사용 :
- 결과 출력
- 총 강의실 개수와 강의 번호 순서대로, 배정한 강의실 번호 출력
백준 답과 강의실 지정 번호가 틀리더라도, 패스를 받을 수 있다.
큐 구현
'IT 성장기 (교육이수) > 알고리즘 문제풀이' 카테고리의 다른 글
백준 : 2098 외판원 순회 (0) | 2025.04.09 |
---|---|
백준 : 2665 미로 만들기 (0) | 2025.03.31 |
백준 : 14888 연산자 끼워넣기 (0) | 2025.03.30 |
백준 : 1260 DFS와 BFS (0) | 2025.03.29 |
백준 : 1197 최소 스패닝 트리 (0) | 2025.03.29 |