코딩 테스트/Level 3

[2023 현대모비스 알고리즘 경진대회 예선] 상담원 인원

컴닥 2024. 11. 23. 10:16
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/214288

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

꽤 빡구현 문제지만, 파이썬은 내장 라이브러리로 꽤 많은 부분을 해결할 수 있어서 어렵지 않다. 
deque, itertools, heapq 등을 모두 동원해야 풀 수 있는 문제.
물론 itertools를 쓰는 것 보다 좀 더 효율적인 방법이 있지만..
가독성 및 코딩 시간 단축을 위해 내장 라이브러리를... 

from collections import deque
from itertools import product
from heapq import heappush, heappop


def solution(k, n, reqs):
    def calculate_waiting_time(_mentors_nums):
        waiting_time = 0
        for request, mentors_num in zip(requests, _mentors_nums):
            queue = deque(sorted(request))
            mentor_end_times = [0] * mentors_num
            while queue:
                _t, _d = queue.popleft()
                min_end_time = heappop(mentor_end_times)
                if min_end_time <= _t:
                    heappush(mentor_end_times, _t + _d)
                else:
                    waiting_time += min_end_time - _t
                    heappush(mentor_end_times, min_end_time + _d)
        return waiting_time

    requests = tuple([] for _ in range(k))
    for t, d, c in reqs:  # 시각, 상담 시간, 상담 유형
        requests[c - 1].append((t, d))
    min_waiting_time = float('inf')
    for mentos_nums in product(range(1, n - k + 2), repeat=k):
        if sum(mentos_nums) == n:
            min_waiting_time = min(min_waiting_time, calculate_waiting_time(mentos_nums))
    return min_waiting_time
반응형