문제 출처

풀이 과정

전체 코드

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 최소_시간