프로그래머스 디스크 컨트롤러

wook2·2021년 6월 25일
0

알고리즘

목록 보기
6/117

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

해결방안을 모르겠어서 정답을 찾아봤었다.
요청부터 일이 끝난 시간까지의 합들을 구하는 문제이기 때문에, 어떤 일이 끝난뒤, 바로 일처리가 가능한 것들중 빨리 끝나는 일 부터 해결하는 것이 시간을 단축하는 방법이다.

바로 일처리가 가능한 일들을 알아보기 위해서는, 어떤 일의 요청시간이 현재 작업하고 있는 일의 중간에 들어오면, 현재 작업하는 일이 끝나면 바로 일을 수행할 수 있다.
만약 바로 일처리가 가능한 일이 없다면, 가장 빠르게 착수할 수 있는 일을 시작하는 것이다.

어떤 일의 요청시간이 있을때, 바로 다음에 일을 할 수 있는지 알아보려면 다음과 같다

  • 현재 작업하고 있는 일의 시작 이후에 요청이 들어와야 한다.
  • 현재 작업하고 있는 일의 끝 전에 요청이 들어와야 한다.

그렇기 때문에 작업을 시작한 시간, 작업이 끝나는 시간 변수가 필요하다.

또 한가지로 어떤 일이 끝나고 가능한 일들 중 가장 빨리 끝나는 일부터 처리하게 되는데, 그 일을 처리하는 도중 처리기간이 짧은 일의 요청이 들어온다면 현재 일을 끝낸 뒤, 짧은 기간의 일을 해결해야 하기 때문에 힙을 통해 최솟값을 계속해서 갱신해주어야 한다.

import heapq
def solution(jobs):
    answer = 0
    current_time = 0
    start = -1
    finished = 0
    heap = []
    jobs.sort(key = lambda x: (x[0],x[1]))
    while finished < len(jobs):
        for job in jobs:
            if start < job[0] <= current_time:
                heapq.heappush(heap,(job[1],job[0]))
        if len(heap) > 0:
            wjob = heapq.heappop(heap)
            start = current_time
            finished += 1
            current_time += wjob[0]
            answer += current_time - wjob[1]
        else:
            current_time += 1
    return answer // len(jobs)
profile
꾸준히 공부하자

0개의 댓글