읽기 전
- 불필요한 코드나 잘못 작성된 내용에 대한 지적은 언제나 환영합니다.
- 개인적으로 배운 점을 정리한 글입니다.
문제 링크
문제 풀이
요청과 처리 완료에 들어가는 시간이 평균적으로 짧아야 한다. 다만 한 번에 한 개의 작업만 가능하다는 점에서 길이가 긴 작업을 먼저 진행하면 뒤이은 작업은 길이가 긴 작업의 진행 시간만큼 대기해야 하므로 평균 처리 시점의 증가로 이어진다.
하나의 작업을 진행하는 동안 접수된 작업 요청들 중 가장 길이가 작은 것들을 우선 처리하고 이후 시점을 갱신하여 다시 대기열을 추가하는 작업이 필요하다.
- 모든 주어진 작업을 완료해야 하므로 전체 진척도를 별도의 값으로 기록한다. 버퍼 count의 값이 주어진 작업 배열의 길이와 같아질 때까지 반복하면 된다.
- 각 순회 단계에서 어떤 작업을 처리할 지 대기열을 생성해야 한다. 우선 요청 시간 범위
start, end
를[-1, 0]
으로 두고 주어진 작업들 중 해당 요청시간 범위에 있는 작업들을[작업 시간, 요청 시각]
으로 바꿔 대기열 힙에 저장한다. - 만약 대기열 힘에 삽입된 작업이 있으면 pop한 뒤 작업 count를 1 더한다. 이후 요청 접수 시작 시간을 기존 시각으로 바꾸고 작업이 진행되었다는 가정 하에 현재 시간을 작업 종료 시간으로 바꾼다.
- 만약 대기열 힙에 어떤 작업도 삽입되지 않았다면 요청 접수 시간이 짧음을 의미하므로 현재 시점에서 1을 더한다.
python 코드
import heapq
def solution(jobs):
start, now = -1, 0
heap = []
cnt = 0
answer = 0
while cnt < len(jobs):
for job in jobs:
if start < job[0] <= now:
heapq.heappush(heap, [job[1], job[0]])
if heap:
x = heapq.heappop(heap)
cnt += 1
start = now
now += x[0]
answer += now - x[1]
else:
now += 1
return answer // len(jobs)
'Algorithms > Programmers' 카테고리의 다른 글
Programmers. 다리를 지나는 트럭 (0) | 2021.08.10 |
---|---|
Programmers. 도둑질 (0) | 2021.08.10 |
Programmers. 등굣길 (0) | 2021.08.10 |
Programmers. 소수 찾기 (0) | 2021.08.10 |
Programmers. 큰 수 만들기 (0) | 2021.07.22 |