## 의사코드 ##
# HH:MM 형태를 분으로 계산 -> HH * 60 + MM
# [(int(s[:2])*60 + int(s[3:]), int(e[:2])*60 + int(e[3:])) for s, e in book_time]
# 대실 시작 시간을 기준으로 정렬
# book_time.sort(key=lambda x: x[0])
# 다음 손님 이용 가능 시각: 대실 종료 시각 + 10분
# 종료 시각이 가장 빠른 객실을 선택
# heapq 이용 -> 최소 힙
# import heapq
# heapq.heappush(heap, 종료 시각)
# 할당할 객실은 종료 시각이 가장 빠른 객실로 선택
# heap[0]
# 다음 손님의 시작 시각이 이전 손님의 종료 시각 이후인 경우, 해당 객실 할당
# if heap[0] <= s:
# heapq.heappop(heap)
# 다음 손님의 시작 시각이 이전 손님의 종료 시각 이전인 경우, 새로운 객실 할당
# else:
# answer += 1
# heapq.heappush(heap, e+10)
통과한 코드
import heapq
def solution(book_time):
answer = 1
# HH * 60 + MM로 변환
book_time = [(int(s[:2])*60 + int(s[3:]), int(e[:2])*60 + int(e[3:])) for s, e in book_time]
# 대실 시작 시간을 기준으로 정렬
book_time.sort(key=lambda x: x[0])
heap = []
for s, e in book_time:
# 할당된 객실이 없으면 객실 할당
if not heap:
heapq.heappush(heap, e)
continue
# 현재 객실 중 가장 빠른 대실 종료 시각이 현재 대실 시작 시각보다 같거나 빠르면 해당 객실을 현재 손님에게 할당
if heap[0] <= s:
heapq.heappop(heap)
# 현재 객실 중 가장 빠른 대실 종료 시각이 현재 대실 시작 시각보다 늦으면 새로운 객실 할당
else:
answer += 1
# 대실 종료 시각 + 10분
heapq.heappush(heap, e+10)
return answer
대실 종료 시각이 가장 빠른 객실을 기준으로 할당할지 안 할지 구분
-> 최솟값을 빠르게 찾을 수 있는 heapq 이용
heapq.heappush(heap, 종료 시각)
과정 확인
book_time = [["15:00", "17:00"], ["16:40", "18:20"], ["14:20", "15:20"], ["14:10", "19:20"], ["18:20", "21:20"]]
"""
정렬된 book_time: [(850, 1160), (860, 920), (900, 1020), (1000, 1100), (1100, 1280)]
현재 손님의 대실 시작 시각:850, 현재 손님의 대실 종료 시각:1160
현재 손님의 대실 시작 시각:860, 현재 손님의 대실 종료 시각:920
현재 객실 중 가장 빠른 대실 종료 시각: 1160
# 새로운 객실 할당
객실 수: 2
heap: [930, 1160]
현재 손님의 대실 시작 시각:900, 현재 손님의 대실 종료 시각:1020
현재 객실 중 가장 빠른 대실 종료 시각: 930
# 새로운 객실 할당
객실 수: 3
heap: [930, 1160, 1030]
현재 손님의 대실 시작 시각:1000, 현재 손님의 대실 종료 시각:1100
현재 객실 중 가장 빠른 대실 종료 시각: 930
# 해당 객실을 현재 손님에게 할당
heap: [1030, 1160, 1110]
현재 손님의 대실 시작 시각:1100, 현재 손님의 대실 종료 시각:1280
현재 객실 중 가장 빠른 대실 종료 시각: 1030
# 해당 객실을 현재 손님에게 할당
heap: [1110, 1160, 1290]
"""