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

이환희·2021년 6월 28일
0

Algorithm

목록 보기
29/47

문제가 길어서 링크로 대신한다.


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

풀이

def solution(jobs):
    answer = 0
    n = len(jobs)
    jobs.sort(key=lambda x: (x[0], x[1]))
    que = []
    while jobs:
        if len(que) == 0:
            que.append(jobs.pop(0))
        out = 0
        while que:
            item = que.pop(0)
            if out == 0:
                out += item[0]+item[1]
            else:
                out += item[1]
            answer += out - item[0]
            while jobs:
                if jobs[0][0] <= out:
                    que.append(jobs.pop(0))
                else:
                    break
            que.sort(key=lambda x: x[1])

    return int(answer/n)

운영체제 시간에 배운 스케쥴러가 생각났다.
우선 순위 큐를 사용하는 문제인것은 확실하고
우선 jobs를 요청시간 순으로 정렬해주었다.
(요청시간이 같으면 작업시간으로 정렬해주어야한다. 여기서 많이 헤맴 ㅠ)

그 다음,
jobs의 아이템을 다 pop할때 까지 반복해주고
que에 아이템을 요청시간 순으로 하나씩 넣어준다.

큐에서는 현재 시간을 나타내는 out을 계속 더해준다

처음 out은 요청시간 + 작업시간으로 초기화 해주고 ex) [2,3] -> 5
다음부터는 작업시간만 더해준다.

answer에는 요청부터 작업까지 걸린 모든 시간을 저장하므로
out - 요청시간 을 계속 더해준다.

그리고
현재 시간보다 요청시간이 작거나 같은 아이템들이 jobs에 존재하면
큐로 넣어주고
큐를 작업시간 순으로 정렬한다.

이 과정을 jobs가 비워질 때 까지 반복하고
처음 jobs의 아이템 개수 만큼 answer를 나눠주면 정답!

처음 풀때 out초기화하는 방법을 고려하지 않아서 틀렸었다.
테스트케이스를 보지 않았다면 맞추기 힘들었을것 같다..

0개의 댓글

관련 채용 정보