Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- max-heap
- 부등호
- 힙
- 그리디
- 프로그래머스
- 파이썬
- ZIP
- 함수화
- 가독성
- 임시 변수
- 변수명
- permutations
- 조합
- 중첩문
- 중첩
- 매직 넘버
- enumerate
- 중간 변수
- 가이드
- 2020 채용
- John Sonmez
- 탈출 조건
- deque
- 스택/큐
- 함수
- 코딩테스트
- boolean
- min heap
- 대소 비교
- 커리어
Archives
- Today
- Total
Better Code, Better Life
디스크 컨트롤러 - 프로그래머스 - 파이썬 풀이 본문
문제 풀이
라면 공장과 유사한 문제 같습니다.
라면 공장에서는 기준점보다 커야만 밀가루를 공급받을 수 있습니다.
디스크 컨트롤러에서는 요청 시간이 현재 시간 이전이어야 작업을 수행할 수 있습니다.
풀이 과정
-
먼저 min heap을 만들어 줍니다. 이 때 heapq 를 이용하기 위해 자료를 가공해줍니다.
- swap_index
- heapq.heapify
-
작업을 모두 처리할 때까지 아래를 반복합니다.
- 처리할 수 있는 작업을 찾습니다. 만약 찾지 못하면 기다립니다.
- get_job
- get_minimal_wait_time
- 처리할 수 있는 작업을 찾습니다. 만약 찾지 못하면 기다립니다.
-
평균 대기 시간을 구합니다.
클린 코드 작성법
- 문제를 해결하기 위한 중간 변수를 만듭니다. 이 때 문제를 잘 이해할 수 있게 변수명을 지어줍니다.
- current_time
- total_wait_time
- 함수를 만들 때, 하나의 기능만을 수행하게 작게 만듭니다.
- get_minimal_wait_time 함수 같은 경우, 이를 찾는 더 좋은 로직이 있다면 이 부분만 수정하면 됩니다.
- 대소 비교시에 작은 값을 왼쪽에 둡니다.
- 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
'Coding Test > Programmers' 카테고리의 다른 글
모의고사 - 프로그래머스 - 파이썬 풀이 (0) | 2019.08.17 |
---|---|
이중우선순위큐 - 프로그래머스 - 파이썬 풀이 (0) | 2019.08.15 |
라면공장 - 프로그래머스 - 파이썬 풀이 (0) | 2019.08.07 |
더 맵게 - 프로그래머스 - 파이썬 풀이 (0) | 2019.08.05 |
주식가격 - 프로그래머스 - 파이썬 풀이 (0) | 2019.08.03 |
Comments