코딩문제풀이/프로그래머스

[Python] 디스크 컨트롤

코딩하는 포메라니안 2021. 8. 29. 22:47

1. 문제

 

 

 

2. 풀이 과정

방법 1)

import heapq as hq
def solution(jobs):
    answer = 0
    jobs.sort()
    
    heap = []
    count = 0 #시간
    pre_idx = -1
    while True:
    	#전에 heap에 안들어갔었고, 현재 count보다 작은 값 heap에 넣기
        temp = pre_idx
        for i in range(temp+1, len(jobs)):
            if jobs[i][0] > count:
                break
            hq.heappush(heap, [jobs[i][1], jobs[i][0]])
            pre_idx = i
            
        if heap:
            e = hq.heappop(heap)
            count += e[0] #요청 처리 끝낸 후
            answer += count - e[1] #현재 시각 - 요청 들어온 시간
        else:
        	#heap에도 없고, jobs도 끝까지 다 읽었으니 종료
            if pre_idx == len(jobs)-1:
                break
            #heap에 없으면 시간 1증가
            count += 1
        
    return answer//len(jobs)

 

방법 2) jobs를 읽은 위치를 저장하기 위해, idx를 따로 저장하는 대신 jobs를 deque를 이용해서 읽은 값은 빼버린다.

앞의 방법 1)보다 약 1.2배 빠르다.

import heapq as hq
from collections import deque
def solution(jobs):
    answer = 0
    l = len(jobs)
    #시작 위치를 key로 정렬하고, 큐에 넣을 때는 [(a[1], a[0])] 형식으로 위치를 바꿔 저장
    #위치를 바꾸는 이유 : min heap에 넣어서, 소요시간을 기준으로 정렬하기 위함
    jobs = deque(sorted([(a[1], a[0]) for a in jobs], key = lambda x:(x[1], x[0])))
    heap = []
    hq.heappush(heap, jobs.popleft())
    count = heap[0][1] #제일 처음 값의 요청이 들어온 시간으로 초기화
    
    while heap:
        dur, start= hq.heappop(heap)
        count += dur
        answer += count-start
        
        #현재 count를 기준으로 요청이 들어온 것들을 넣기
        while jobs and jobs[0][1] <= count:
            hq.heappush(heap, jobs.popleft())
        
        #heap은 비었고, 처리해야할 jobs 아직 남아있을 때 : count를 다음 요청까지 한번에 증가시키자
        if not heap and jobs:
            e = jobs.popleft()
            count = e[1]
            hq.heappush(heap, e)
    
    return answer//l

'코딩문제풀이 > 프로그래머스' 카테고리의 다른 글

[Python] 섬 연결하기  (0) 2021.08.30
[Python] 이중우선순위큐  (0) 2021.08.30
[Python] 베스트앨범  (0) 2021.08.29
[Python] 타겟 넘버  (0) 2021.08.29
[Python] 구명보트  (0) 2021.08.28