본문 바로가기

코테

[프로그래머스] <디스크 컨트롤러> 파이썬

programmers.co.kr/learn/courses/30/lessons/42627#

 

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

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

programmers.co.kr

def solution(jobs) :
    answer, endtime, L = 0, 0, len(jobs)
    
    jobs.sort()
    while jobs :
        job, index, around = jobs[0], 0, 0
        around = job[1]+job[0] if endtime<=job[0] else job[1] + (endtime-job[0])
        for i in range(1,len(jobs)) :
            temp = jobs[i][1] + jobs[i][0] if endtime<jobs[i][0] else jobs[i][1] + (endtime-jobs[i][0])
            if around > temp : job, around, index = jobs[i], temp, i
        
        answer += job[1] if endtime<job[0] else endtime - job[0] + job[1]
        endtime = job[0]+job[1] if endtime<job[0] else endtime+job[1]
        print(job,answer, endtime, around)
        del jobs[index]
        
    return int(answer/L)

정확성 테스트

테스트 1 실패 (11.74ms, 10.3MB)
테스트 2 실패 (10.31ms, 10.3MB)
테스트 3 실패 (7.76ms, 10.4MB)
테스트 4 실패 (6.65ms, 10.3MB)
테스트 5 실패 (11.26ms, 10.3MB)
테스트 6 실패 (0.10ms, 10.3MB)
테스트 7 실패 (6.41ms, 10.3MB)
테스트 8 실패 (3.87ms, 10.3MB)
테스트 9 실패 (1.27ms, 10.3MB)
테스트 10 실패 (15.55ms, 10.3MB)
테스트 11 실패 (0.06ms, 10.3MB)
테스트 12 통과 (0.05ms, 10.3MB)
테스트 13 실패 (0.05ms, 10.3MB)
테스트 14 실패 (0.03ms, 10.3MB)
테스트 15 통과 (0.03ms, 10.4MB)
테스트 16 통과 (0.03ms, 10.4MB)
테스트 17 통과 (0.02ms, 10.3MB)
테스트 18 실패 (0.02ms, 10.3MB)
테스트 19 통과 (0.03ms, 10.2MB)
테스트 20 통과 (0.01ms, 10.3MB)

채점 결과

정확성: 30.0

합계: 30.0 / 100.0

 

실화니?

테케 공유 된거

print(solution([[0, 10], [2, 10], [9, 10], [15, 2]]), 14)

print(solution([[0, 10], [2, 12], [9, 19], [15, 17]]), 25)

print(solution([[0, 3], [1, 9], [2, 6]]), 9)

print(solution([[0, 1]]), 1)

print(solution([[1000, 1000]]), 1000)

print(solution([[0, 1], [0, 1], [0, 1]]), 2)

print(solution([[0, 1], [0, 1], [0, 1], [0, 1]]), 2)

print(solution([[0, 1], [1000, 1000]]), 500) 

print(solution([[100, 100], [1000, 1000]]), 500) => 550 아님??? ㅜㅠㅠㅠ 이거 말고 다 맞는데,,

print(solution([[10, 10], [30, 10], [50, 2], [51, 2]]), 6)

print(solution([[0, 3], [1, 9], [2, 6], [30, 3]]), 7)

 

heapq로 구현

 

import heapq
def solution(jobs) :
    answer, endtime, L = 0, 0, len(jobs)
    jobs.sort()
    endtime = jobs[0][0]
    heap = []
    while True :
        if not heap and not jobs : break
        for i in jobs :
            if not jobs : break
            if i[0] > endtime : break
            else : 
                heapq.heappush(heap,(i[1],i[0]))
                del jobs[jobs.index(i)]

        while True :
            if not heap and not jobs : break
            if jobs :
                if jobs[0][0] <= endtime : break
                if not heap : 
                    endtime = jobs[0][0]
                    break
            if heap :
                job = heapq.heappop(heap)
                answer += job[0] + (endtime - job[1])
                endtime += job[0]
                
        
    return int(answer/L)

정확성 테스트

테스트 1 통과 (1.74ms, 10.3MB)
테스트 2 통과 (1.25ms, 10.3MB)
테스트 3 통과 (0.78ms, 10.3MB)
테스트 4 통과 (0.60ms, 10.2MB)
테스트 5 통과 (0.95ms, 10.3MB)
테스트 6 통과 (0.04ms, 10.4MB)
테스트 7 통과 (0.66ms, 10.3MB)
테스트 8 통과 (0.77ms, 10.2MB)
테스트 9 통과 (0.19ms, 10.3MB)
테스트 10 통과 (1.48ms, 10.2MB)
테스트 11 통과 (0.02ms, 10.3MB)
테스트 12 통과 (0.02ms, 10.2MB)
테스트 13 통과 (0.02ms, 10.3MB)
테스트 14 통과 (0.02ms, 10.3MB)
테스트 15 통과 (0.02ms, 10.3MB)
테스트 16 통과 (0.01ms, 10.3MB)
테스트 17 통과 (0.01ms, 10.2MB)
테스트 18 통과 (0.02ms, 10.3MB)
테스트 19 통과 (0.02ms, 10.3MB)
테스트 20 통과 (0.01ms, 10.3MB)

채점 결과

정확성: 100.0

합계: 100.0 / 100.0