반응형
Notice
Recent Posts
Recent Comments
Link
동캄의 코딩도장
프로그래머스 level3 [디스크 컨트롤] 파이썬 본문
반응형
https://programmers.co.kr/learn/courses/30/lessons/42627
코딩테스트 연습 - 디스크 컨트롤러
하드디스크는 한 번에 하나의 작업만 수행할 수 있습니다. 디스크 컨트롤러를 구현하는 방법은 여러 가지가 있습니다. 가장 일반적인 방법은 요청이 들어온 순서대로 처리하는 것입니다. 예를
programmers.co.kr
def solution(jobs):
answer = 0
schedule = []
jobs.sort()
length = len(jobs)
end = 0
while jobs:
if schedule: #대기 열이 존재하는 경우
start, spend = schedule.pop()
answer += (spend+end-start)
end += spend
else: #대기 열이 없는 경우
start, spend = jobs.pop(0)
answer += spend
end = start+spend
while jobs and jobs[0][0] <= end: # 작업이 끝나는 시간 전에 도착하는 작업들을 대기 열에 추가
schedule.append(jobs.pop(0))
schedule.sort(key=lambda x: -x[1]) # 작업의 시간을 오름차순으로 정렬
schedule.sort(key=lambda x: -x[1])
while schedule:
start, spend = schedule.pop()
answer += (spend+end-start)
end += spend
answer = answer//length
return answer
디스크 작업에서 두가지 경우가 존재한다. (아무작업이 없는 경우는 제외)
1. 바로 작업을 받아서 시작하는 경우
2. 작업을 기다렸다가 끝나면 바로 이어서 시작하는 경우
작업이 끝나는 시간(end)가 다른 작업의 도착시간보다 크다면 작업의 정보가 schedule list에 저장된다.
한 번 while문을 돌때마다 정렬을 하기에 복잡도 측면에서는 좋지 않은 코드이다..
import heapq
def solution(jobs):
answer, now, i = 0, 0, 0
start = -1
heap = []
while i < len(jobs): # 현재 시점에서 처리할 수 있는 작업을 heap에 저장
for j in jobs:
if start < j[0] <= now:
heapq.heappush(heap, [j[1], j[0]])
if len(heap) > 0: # 처리할 작업이 있는 경우
cur = heapq.heappop(heap)
start = now
now += cur[0]
answer += now - cur[1] # 작업 요청시간부터 종료시간까지의 시간 계산
i +=1
else: # 처리할 작업이 없는 경우 다음 시간을 넘어감
now += 1
return answer // len(jobs)
출처: https://soohyun6879.tistory.com/136 [코딩기록]
다른 분의 힙을 이용한 풀이이다. 전체적인 코드는 비슷하지만, 힙을 이용했기 때문에, 시간 복잡도 측면에서 더 성능이 좋을 것으로 기대된다.
반응형
'코테 > 프로그래머스' 카테고리의 다른 글
프로그래머스 level3 [섬 연결하기] 파이썬 (0) | 2022.04.08 |
---|---|
프로그래머스 level3 [이중우선순위큐] 파이썬 (0) | 2022.04.07 |
프로그래머스 level3 [베스트앨범] 파이썬 (0) | 2022.04.07 |
프로그래머스 level3 [입국심사] 파이썬 (0) | 2022.04.07 |
프로그래머스 level2 [양궁대회] 파이썬 (0) | 2022.02.09 |