알고리즘

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

유병각 2022. 1. 8. 18:21

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

 

이 문제는 우선순위 큐 ( 힙 ) 을 사용해서 푸는 문제였는데 몇가지 풀리지 않은 궁금증이 있다.

 

1.  실행 시간이 가장 작은걸 먼저 실행하는게 결과적으로 최소의 평균시간을 도출한다는 것을 어떻게 증명할 수 있는지?

2. heap 에 값을 push 할 때 실행시간은 같지만, 더 먼저 요청된 작업을 먼저 실행하든 말든 결과에는 영향이 없는데 이걸 어떻게 수학적으로 증명 할 수 있는지?

 

---> 수정

  • 하드디스크가 작업을 수행하고 있지 않을 때에는 먼저 요청이 들어온 작업부터 처리합니다. 라는 조건때문에 이 모든게 성립한다.
  • 즉, 현재 수행 할 수 있는 작업들을 heap에 넣는데, 정렬 기준은 작업 시간의 오름차순으로 넣는다.
 

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

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

programmers.co.kr

import heapq;

def solution(jobs):
    jobs.sort(key=lambda x: (x[0], x[1]));
    i = 0;
    t = 0;
    ret = 0;
    beforeTime = -1;
    heap = [];

    while(i < len(jobs)):
        for job in jobs:
            if (beforeTime < job[0] <= t):
                heapq.heappush(heap, [job[1], job[0]]);
        
        if (heap) :
            beforeTime = t;    
            now = heapq.heappop(heap);
            t += now[0];
            ret += (t - now[1]);
            i += 1;
        else :
            t += 1;
    return ret // len(jobs)

https://codeforces.com/contest/1622/problem/C

 

Problem - C - Codeforces

 

codeforces.com

import math
from collections import deque
t = int(input())
ret = [];
for _ in range(t):
    n, k = map(int,input().split());
    arr = list(map(int,input().split()));
    ans = 1e16;
    arr.sort();
    a1 = arr[0];
    p = [0] * (n+1);
 
    for i in range(n):
        p[i+1] = p[i] + arr[i];
 
    for i in range(n):
        x = math.ceil(a1 - ((k + a1 - p[n-i]) / (i+1)));
        if x < 0 :
            x = 0;
        ans = min(ans, x + i);
    
    ret.append(ans);
 
for a in ret:
    print(a);