[힙] 디스크 컨트롤러

yejichoi·2023년 7월 20일
0

알고리즘 스터디

목록 보기
70/153
post-thumbnail

디스크 컨트롤러

하드디스크는 한 번에 하나의 작업만 수행할 수 있습니다. 디스크 컨트롤러를 구현하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 요청이 들어온 순서대로 처리하는 것입니다.
각 작업에 대해 [작업이 요청되는 시점, 작업의 소요시간]을 담은 2차원 배열 jobs가 매개변수로 주어질 때, 작업의 요청부터 종료까지 걸린 시간의 평균을 가장 줄이는 방법으로 처리하면 평균이 얼마가 되는지 return 하도록 solution 함수를 작성해주세요. (단, 소수점 이하의 수는 버립니다)

제한사항

  • jobs의 길이는 1 이상 500 이하입니다.
  • jobs의 각 행은 하나의 작업에 대한 [작업이 요청되는 시점, 작업의 소요시간] 입니다.
  • 각 작업에 대해 작업이 요청되는 시간은 0 이상 1,000 이하입니다.
  • 각 작업에 대해 작업의 소요시간은 1 이상 1,000 이하입니다.
  • 하드디스크가 작업을 수행하고 있지 않을 때에는 먼저 요청이 들어온 작업부터 처리합니다.

입출력

jobsreturn
[[0, 3], [1, 9], [2, 6]]9

나의 풀이

import heapq
def solution(jobs):
    answer = 0
    tunnel = []
    cnt = len(jobs)
    time = 0
    #jobs = heapq.heapify(jobs) #None
    #while jobs:
    for i in range(len(jobs)):
        befar = jobs[i][0]
        if not befar:
            befar = 0
        print(befar)
    while jobs:
        if len(tunnel) == 0: 
            first = heapq.heappop(jobs)
            tunnel.append(first)
            time += befar +tunnel[0][1] - tunnel[0][0]
            #first[1]  = first[1] - 1
            tunnel.pop()
            print(time, first[0], first[1])
            #break
#print(time // cnt)
        
    return time // cnt

풀이

import heapq

def solution(jobs):
 jobs.sort(key=lambda x: x[0])  # 요청 시점 기준으로 정렬
 time, total_time, cnt = 0, 0, len(jobs)
 heap = []  # 최소 힙 (소요 시간 기준)

 while jobs or heap:
     # 현재 시점에서 처리 가능한 작업들을 heap에 추가
     while jobs and jobs[0][0] <= time:
     # 3초 동안 두번째, 세번째 작업 다 대기하니까
         request_time, processing_time = jobs.pop(0)
 #소요 시간이 가장 짧은 작업을 선택하기 위해서 process, request 순서
         heapq.heappush(heap,
         (processing_time, request_time))
     
     if heap:
         # heap에서 소요 시간이 가장 짧은 작업 선택
         processing_time, 
         request_time = heapq.heappop(heap)
         time += processing_time
         total_time += time - request_time
     else:
         # 현재 시점에서 처리 가능한 작업이 없으면 시간을 1 증가
         time += 1

 return total_time // cnt
import heapq

def solution(jobs):
    answer, now, i = 0, 0, 0
    start = -1 
    heap = []
    
    while i < len(jobs):
        # 현재 시점에서 처리할 수 있는 작업을 heap에 저장
        for j in jobs:
            if start < j[0] <= now:
                heapq.heappush(heap, [j[1], j[0]])
        
        if len(heap) > 0: # 처리할 작업이 있는 경우
            cur = heapq.heappop(heap)
            start = now
            now += cur[0]
            answer += now - cur[1] 
            # 작업 요청시간부터 종료시간까지의 시간 계산
            i +=1
        else: # 처리할 작업이 없는 경우 다음 시간을 넘어감
            now += 1
                
    return answer // len(jobs)

1개의 댓글

comment-user-thumbnail
2023년 7월 20일

좋은 글 감사합니다!

답글 달기