문제 출처
풀이 과정
전체 코드
from itertools import combinations_with_replacement
from collections import deque
def solution(상담_유형수, 멘토수, 요청_리스트):
남은_멘토수 = 멘토수 - 상담_유형수
선택_리스트 = [i for i in range(상담_유형수)] # [0, 1, ..., k-1]
최소_시간 = 1e+9
큐 = deque()
for 유형_조합 in combinations_with_replacement(선택_리스트, 남은_멘토수):
총_대기시간 = 0
유형별_남은_멘토수 = [1 for _ in range(상담_유형수)]
유형별_상담_사전 = {i: [] for i in range(상담_유형수)} # 각 유형마다 상담 종료 시간(리스트) 저장
for 요청 in 요청_리스트: 큐.append(요청)
# 각 유형 별 배치 가능한 멘토 수 계산
for 유형 in 유형_조합: 유형별_남은_멘토수[유형] += 1
# 상담 요청 정보 및 유형 별 멘토 수 정보에 따라 총 대기 시간을 계산
while 큐:
요청 = 큐.popleft()
시작_시간, 상담_시간, 유형_번호 = 요청[0], 요청[1], 요청[-1]
종료_시간_리스트 = 유형별_상담_사전[유형_번호-1].copy()
# 유형별 상담 현황 갱신: 상담이 끝난 멘토가 있는지 확인 후 갱신
for 상담_종료_시간 in 유형별_상담_사전[유형_번호-1]:
if 시작_시간 >= 상담_종료_시간:
유형별_남은_멘토수[유형_번호-1] += 1
종료_시간_리스트.remove(상담_종료_시간)
# 해당 상담 유형의 멘토가 남은 경우 -> 바로 상담 진행
if 유형별_남은_멘토수[유형_번호-1] > 0:
유형별_남은_멘토수[유형_번호-1] -= 1
종료_시간_리스트.append(시작_시간 + 상담_시간)
# 해당 상담 유형의 멘토가 없는 경우 -> 가장 빠른 시간에 끝나는 멘토한테 상담 대기
else:
총_대기시간 += (종료_시간_리스트[0] - 시작_시간)
종료_시간 = 종료_시간_리스트.pop(0)
종료_시간_리스트.append(종료_시간 + 상담_시간)
유형별_상담_사전[유형_번호-1] = sorted(종료_시간_리스트)
if 최소_시간 > 총_대기시간: 최소_시간 = 총_대기시간
return 최소_시간
Python
복사