하드디스크는 한 번에 하나의 작업만 수행할 수 있습니다. 디스크 컨트롤러를 구현하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 요청이 들어온 순서대로 처리하는 것입니다.
예를들어
한 번에 하나의 요청만을 수행할 수 있기 때문에 각각의 작업을 요청받은 순서대로 처리하면 다음과 같이 처리 됩니다.
하지만 A → C → B 순서대로 처리하면
각 작업에 대해 [작업이 요청되는 시점, 작업의 소요시간]을 담은 2차원 배열 jobs가 매개변수로 주어질 때, 작업의 요청부터 종료까지 걸린 시간의 평균을 가장 줄이는 방법으로 처리하면 평균이 얼마가 되는지 return 하도록 solution 함수를 작성해주세요. (단, 소수점 이하의 수는 버립니다)
jobs | return |
---|---|
[[0, 3], [1, 9], [2, 6]] | 9 |
# 코드
import heapq
def solution(jobs):
answer = 0
# jobs를 요청 시간에 따라 오름차순으로 정렬
jobs.sort(key = lambda x : (x[0], x[1]))
jobs_size = len(jobs) # jobs 개수
jobs_heap = [] # 작업을 담을 (min)heap
# start : 이전 완료 시점
# now : 현재 완료시점
# cnt : 완료한 작업의 수
# idx : jobs 인덱스
start, now, cnt, idx = -1, 0, 0, 0
# 모든 작업을 완료할 때까지 반복
while cnt < jobs_size:
# start와 now 사이의 시간에 요청이 들어올 경우
# jobs_heap에 추가
while idx < jobs_size and start < jobs[idx][0] <= now:
heapq.heappush(jobs_heap, (jobs[idx][1], jobs[idx][0]))
idx += 1
# jobs_heap에 요소가 있는 경우
# 가장 작업 시간이 작은 작업 수행
if jobs_heap:
work, req_time = heapq.heappop(jobs_heap)
start = now
now += work
answer += (now - req_time)
cnt += 1
# jobs_heap에 요소가 없는 경우
# now를 늘려가며 작업 요청 대기
else:
now += 1
# // 연산을 통해 소수점 제거
answer = answer // jobs_size
return answer