[프로그래머스] 디스크 컨트롤러 | 파이썬 (💡 SJF 스케줄링 구현하기)

2022. 6. 1. 20:53Problem Solving/Programmers

문제 설명

 

코딩테스트 연습 - 디스크 컨트롤러

하드디스크는 한 번에 하나의 작업만 수행할 수 있습니다. 디스크 컨트롤러를 구현하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 요청이 들어온 순서대로 처리하는 것입니다. 예를

programmers.co.kr

 

문제 풀이

작업의 요청부터 종료까지 걸린 시간의 평균을 최소로 만들어야하는, 즉 SJF(Shortest-Job-First) 스케줄링을 비선점형 방식으로 구현하는 문제였다. 마침 운영체제에서 스케줄링 기법을 공부하고 있었던 터라 반가웠던 문제❕

 

스케줄링에 관한 내용은 아래에서 확인

 

[운영체제] 4. CPU 스케줄링 | KOCW 2017 이화여대 반효경 교수님

* 강의를 듣고 복습하며 정리한 내용입니다. CPU 프로그램의 기계어 명령을 수행하는 컴퓨터 내 중앙 처리 장치 CPU 스케줄링 Ready Queue에 있는 프로세스 중 CPU를 줄 프로세스를 고르는 것. 운영체

donghae0230.tistory.com

 

전체 코드

import heapq

def solution(jobs):
    n = len(jobs)
        
    now = 0     # 현재 시간
    answer = 0  # 소요시간의 합
    count = 0   # 처리량
    ready_queue = []
    
    while count < n:
        for i in range(n):
            # 처리 되지 않은 작업이면서 요청 시간이 현재 시간보다 작은 경우
            if jobs[i] and jobs[i][0] <= now:
                heapq.heappush(ready_queue, (jobs[i][1], jobs[i][0]))
                # Ready Queue에 들어간 작업은 False로 처리
                jobs[i] = False 
        
        # Ready Queue에 처리할 작업이 있는 경우
        if ready_queue:
            size, request = heapq.heappop(ready_queue)
            
            # 처리 후 시간을 현재 시간으로 갱신
            now += size
            answer += (now - request)
            count += 1
        else:
            now += 1
    return answer // n

 

✔ Ready Queue에 처리할 작업이 없어도 시간은 흘러가야 한다.

= 반복문 내 now 변수를 사용하자❕

* 처리할 작업이 있으면 소요시간을 더해 갱신하고 없으면 1 더하기

 

 각 시점마다 작업의 소요시간이 가장 작은 작업을 처리해야 한다.

= 우선순위 큐를 사용하자❕

* 파이썬의 heapq 라이브러리 사용