Better Code, Better Life

디스크 컨트롤러 - 프로그래머스 - 파이썬 풀이 본문

Coding Test/Programmers

디스크 컨트롤러 - 프로그래머스 - 파이썬 풀이

심재훈 2019. 8. 13. 19:51

문제 풀이

라면 공장과 유사한 문제 같습니다.

​  라면 공장에서는 기준점보다 커야만 밀가루를 공급받을 수 있습니다.

​  디스크 컨트롤러에서는 요청 시간이 현재 시간 이전이어야 작업을 수행할 수 있습니다.

풀이 과정

  1. 먼저 min heap을 만들어 줍니다. 이 때 heapq 를 이용하기 위해 자료를 가공해줍니다.

    1. swap_index
    2. heapq.heapify
  2. 작업을 모두 처리할 때까지 아래를 반복합니다.

    1. 처리할 수 있는 작업을 찾습니다. 만약 찾지 못하면 기다립니다.
      1. get_job
      2. get_minimal_wait_time
  3. 평균 대기 시간을 구합니다.

클린 코드 작성법

  1. 문제를 해결하기 위한 중간 변수를 만듭니다. 이 때 문제를 잘 이해할 수 있게 변수명을 지어줍니다.
    1. current_time
    2. total_wait_time
  2. 함수를 만들 때, 하나의 기능만을 수행하게 작게 만듭니다.
    1. get_minimal_wait_time 함수 같은 경우, 이를 찾는 더 좋은 로직이 있다면 이 부분만 수정하면 됩니다.
  3. 대소 비교시에 작은 값을 왼쪽에 둡니다.
    1. request_time <= current_time

해답 코드

import heapq

def solution(jobs):
    jobs = swap_index(jobs)
    heapq.heapify(jobs)
    current_time = 0
    total_wait_time = 0
    job_length = len(jobs)
    while jobs:
        job = get_job(current_time, jobs)
        if not job:
            wait_time = get_minimal_wait_time(current_time, jobs)
            current_time += wait_time
        else:
            process_time, request_time = job
            current_time += process_time
            wait_time = current_time - request_time
            total_wait_time += wait_time
    mean_wait_time = total_wait_time // job_length
    return mean_wait_time

def swap_index(jobs):
    swapped_list = []
    for job in jobs:
        swapped_job = [job[1], job[0]]
        swapped_list.append(swapped_job)
    return swapped_list

def get_job(current_time, jobs):
    job_candidates = []
    chosen_job = None
    while jobs:
        job_candidate = heapq.heappop(jobs)
        job_candidates.append(job_candidate)
        process_time, request_time = job_candidate
        if request_time <= current_time:
            chosen_job = job_candidate
            job_candidates.pop()
            break
    for job_candidate in job_candidates:
        heapq.heappush(jobs, job_candidate)
    return chosen_job

def get_minimal_wait_time(current_time, jobs):
    job = min(jobs, key=lambda x: x[1])
    wait_time = job[1] - current_time    
    return wait_time

도움이 됐다면 공감버튼을 눌러주세요! 질문이 있다면 댓글 달아주세요!

 

문제 링크

 

코딩테스트 연습 - 디스크 컨트롤러 | 프로그래머스

하드디스크는 한 번에 하나의 작업만 수행할 수 있습니다. 디스크 컨트롤러를 구현하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 요청이 들어온 순서대로 처리하는 것입니다. 예를들어 - 0ms 시점에 3ms가 소요되는 A작업 요청 - 1ms 시점에 9ms가 소요되는 B작업 요청 - 2ms 시점에 6ms가 소요되는 C작업 요청 와 같은 요청이 들어왔습니다. 이를 그림으로 표현하면 아래와 같습니다. 한 번에 하나의 요청만을 수행할 수 있기 때문에 각각의

programmers.co.kr

Comments