본문 바로가기
스터디/알고리즘

디스크 컨트롤러

by 세졍 2024. 7. 1.

문제이해 
jobs의 각 행은 하나의 작업에 대한 [작업이 요청되는 시점, 작업의 소요시간]
작업의 요청부터 종료까지 걸린 시간의 평균이 최소가 되는 값 구하기
즉 작업의 요청부터 종료까지 걸린시간을 최소로 하기


핵심 : 작업시간이 가장 적게걸리는 것 (작업소요시간이작은것) 부터 수행한다

1. 시작시간을 0 으로 하고 그시간에 담을 수 있는작업들을 배열temp에 담기

2. temp 에다가 작업시간이 적게걸리는 순으로 빼내기
3. 현재시간에 수행할 수 있는 작업이 없으면 jobs 에서 다시 꺼내서 시간과 answer 계산하기

 

 

 

import heapq
def solution(jobs):
    n = len(jobs)
    answer = 0
    temp = [] # 현재시간에 수행할수있는 작업 담는 배열
    heapq.heapify(jobs)
    time = 0
    while jobs or temp:
    	# jobs배열이 있고 현재수행할 수있으면 temp에 담기
        while jobs and jobs[0][0] <= time:
            request_start,work_time = heapq.heappop(jobs)
            heapq.heappush(temp,[work_time,request_start])
		
        # temp 에 있는 작업시간이 적은것부터 수행 , 시간과 answer증가시키기
        if temp:
            work,request = heapq.heappop(temp)
            time += work
            answer += time - request
		
        
        # 작업끝난시간에 수행할 수 있는 시간이 없으면 jobs에서 꺼내서 현재시간다시계산
        elif jobs:
            request,work = heapq.heappop(jobs)
            time = work + request
            answer += time - request

    return answer

jobs = [[0, 3], [1, 9], [15, 6]]
print(solution(jobs))

 

 

def solution(jobs):
    answer = 0  # 작업요청부터 종료까지 걸린 총시간
   
    n = len(jobs)  
    sorted_list = sorted(jobs, key=lambda x: x[1])   # 소요 시간 오름차순 정렬

    time = 0 #현재시간
    while sorted_list:
        for i in range(len(sorted_list)):
            # 작업 시점이 start보다 작거나같으면 작업시작하기
            if sorted_list[i][0] <= time:
                time += sorted_list[i][1]
                answer += start - sorted_list[i][0]
                sorted_list.pop(i)
                break
            

        else: # 반복문을 모두 돌았을 경우에도 시작하는 시간이없다면 시간을 1증가 , break에 하나도 안걸리면 시간증가
            time += 1

    return answer // n


jobs = [[0, 3], [1, 9], [15, 6]]
print(solution(jobs))

 

 

'스터디 > 알고리즘' 카테고리의 다른 글

H-index  (0) 2024.07.06
기지국 설치  (0) 2024.06.24
귤고르기  (0) 2024.06.24
구명보트  (0) 2024.06.24
거스름돈(dp)  (0) 2024.06.23