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

문제 풀이

생각할게 많아서 꽤 어렵다고 느낀 문제입니다.

작업이 끝났을 때 대기하고 있는 작업을 확인하면 되는 문제였는데 저는 1초마다 자꾸 확인하려고 해서 빙빙 돌아갔네요.

  1. 현재 시간과 순서를 0으로 세팅, 시작 시간은 0이 아니라 -1로 해야 heappush를 할 때 시간의 비교가 제대로 됩니다
  2. 요청 시간 순으로 정렬해서 2번 조건을 맞출 수 있도록 세팅jobs.sort()
  3. 모든 작업을 끝내기 전까지(i<len(jobs)) 반복하는 while문 세팅
  4. jobs의 j번째 작업을 현시점에 작업 큐에 넣을 수 있는 지 확인하고, 가능하다면 소요 시간을 기준으로 heappush
  5. 만약 q에 값이 들어가있다면(대기중인 큐가 있다면) 꺼내서 start를 현재 시간으로 설정, 현재 시간에는 큐에서 꺼낸 작업의 소요 시간을 추가, answer에는 (작업종료시점 - 요청 시점)을 더해서 총 걸린 시간을 계산합니다
  6. 대기중인 작업이 없다면 1초를 더해서 작업을 찾으러 가는걸 반복하면 됩니다

풀이 코드

import heapq

def solution(jobs):
    # answer는 기본값이고 now와 i의 시작점은 0이니까 일단 지정
    answer, now, i = 0, 0, 0
    start = -1
    q = []

    # 요청 시간 순으로 정렬
    jobs.sort()

    while i < len(jobs):
        for j in range(i, len(jobs)):
            # 작업의 시작 시점이 현시점 이전이라면 넣음
            if start < jobs[j][0] <= now:
                # 소요시간(dur) 기준으로 (dur, 요청시간) 넣음
                heapq.heappush(q, [jobs[j][1], jobs[j][0]])
            elif jobs[j][0] > now:
                break  # 미래 작업이 나오면 중단

        if q:
            current_dur, current_start = heapq.heappop(q)
            start = now
            now += current_dur
            # 반환 시간 = (작업 종료 시점 - 요청 시점)
            answer += (now - current_start)
            i += 1  # 처리한 작업 수 카운트
        else:
            # 지금 처리할 수 있는 작업이 없으면 다음 요청으로 이동
            now += 1

    return answer // len(jobs)
반응형