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

메링·2021년 6월 17일
0

알고리즘 문제

목록 보기
10/22

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

1차 시도 (성공)

while 한 번에 1초 지나간다고 생각.
answer : 답 내기 위한 총 시간 더하기
curr_time : 현재 시간(while) 돌아간 횟수
finish_time : 현재 작업 중인 일이 끝마치는 시간
now : 현재 작업중인 일의 소요 시간
대기 heap에 아무 것도 없을 경우를 예외처리로 따로 해줌. 이를 위해서 now 생성한 것.

-> 너무 길고,, 더 짧고 간단하게 구현 가능할 듯
++ 처음에.. return 정수 처리를 안 해서 끙끙 괜히 고민함

import heapq

def solution(jobs):
    answer, curr_time, finish_time, now = 0, 0, 0, 0
    waiting = []
    jobs.sort()
    total = len(jobs)

    while jobs or waiting:
        if jobs:
            while jobs[0][0] == curr_time:  # 대기 heap에 삽입
                start = jobs.pop(0)
                if now == 0:
                    finish_time = curr_time + start[1]
                    now = start[1]
                    answer += now
                else:
                    heapq.heappush(waiting, start[1])
                if not jobs:
                    break

        if curr_time == finish_time:  # 작업 끝났으면 다른 작업 시작
            if waiting:
                now = heapq.heappop(waiting)
                finish_time = curr_time + now
                answer += now
            else:
                now = 0

        answer += 1 * len(waiting)
        curr_time += 1

    return answer//total

2차 시도 (다른 분 풀이 참고)

시간을 1초 기준으로 한 것이 아니라 그낭 현재 작업을 시작한 시간과 끝난 시간을 기준으로 함.

import heapq

def solution(jobs):
    answer, start_time, count = 0, -1, 0
    waiting = []
    fin_time = jobs[0][0]
    
    while count < len(jobs):
        for s, t in jobs:
            if start_time < s < fin_time:
                heapq.heappush(waiting, [t, s])
        if len(waiting) > 0:
            new = heapq.heappop(waiting)
            start_time = fin_time
            fin_time += new[0]
            answer += (fin_time - new[1])
            count += 1
            
        else:
            fin_time += 1
        
    return answer // len(jobs)
profile
https://github.com/HeaRinKim

0개의 댓글