프로그래머 (programmers) 디스크 컨트롤러 파이썬 정답 (힙)

  • by

프로그래머 (programmers) 디스크 컨트롤러 파이썬 정답 (힙)

문제 링크

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

문제 정답

입출력 예

직업 return
((0, 3), (1, 9), (2, 6)) 9

정답 코드

import heapq
import math
def solution(jobs):
    heapq.heapify(jobs)
    current = 0
    answer = ()
    n = len(jobs)
    while jobs:
        # 타임 점프 - 작업이 실행 가능한 시간으로 점프한다.

if current <= jobs(0)(0): current = jobs(0)(0) # 실행 가능한 작업들을 추린다.

targets = () while jobs and jobs(0)(0) <= current: c,d = heapq.heappop(jobs) # 힙은 오름차순 이므로 D를 배열의 앞에 위치한다.

heapq.heappush(targets,(d,c)) # 시간을 갱신한다.

힙은 오름차순 이므로 D가 작은 것부터 처리한다.

nextD,nextC = heapq.heappop(targets) current += nextD answer.append(current-nextC) for d,c in targets: heapq.heappush(jobs,(c,d)) return math.floor(sum(answer) // n)

문제 해설


대기 시간 감소

작업 요청 시간에서 걸린 총 시간을 최소화해야 합니다.

함께 시작할 수 있는 4ms, 7ms의 일이 있다고 생각해 보자.

만약 4ms부터 시작하면 4ms+11ms=>15ms가 된다.

만약 11ms부터 시작하면 7ms + 11ms => 18ms가 된다.

7ms를 먼저 처리하면 4ms와 동시에 큐에 존재하는 시간이 3초 증가하기 때문이다.

따라서, 빨리 종료하는 잡을 우선 처리하지 않으면, 총 대기 시간이 짧아지는 것을 알 수 있다.

간단하게 생각하면 큐에 복수의 아이템이 함께 존재하면, 동시에 대기 시간이 늘어나므로,

큐에 있는 아이템의 개수를 줄인다고 생각하면 된다.

로직은 코드의 주석을 참고로 하면 되지만, 핵심은 다음과 같다.

  1. jobs를 시작 가능 시간이 짧은 것에서 힙에 넣습니다.

    (초기화)
  2. 실행 가능한 작업을 별도로 힙에 던집니다.

    이 힙은 실행 시간이 짧은 것부터 시작합니다.

  3. 3의 힙에서 가장 빨리 끝나는 작업을 하나 처리한 후 나머지 작업을 다시 힙에 넣고 2를 반복합니다.