Search

PGS 운영체제

URL
태그
구현
브루트포스 알고리즘
자료 구조
우선순위 큐

문제 설명

주어진 프로그램들을 우선순위와 호출 시각에 따라 실행하고, 각 프로그램의 종료 시점과 프로그램 점수별 대기시간 합을 구하는 문제

예제 입력/출력

program
result(answer)
[[2, 0, 10], [1, 5, 5], [3, 5, 3], [3, 12, 2]]
[20, 5, 0, 16, 0, 0, 0, 0, 0, 0, 0]
[[3, 6, 4], [4, 2, 5], [1, 0, 5], [5, 0, 5]]
[19, 0, 0, 4, 3, 14, 0, 0, 0, 0, 0]

제약 조건

11 ≤ program의 길이 100,000≤ 100,000
program[i][a, b, c]의 형태
aa: 프로그램의 점수 (1a10)(1 ≤ a ≤ 10)
bb: 프로그램이 호출된 시각 (0b10,000,000)(0 ≤ b ≤ 10,000,000)
cc: 프로그램의 실행 시간 (1c1,000)(1 ≤ c ≤ 1,000)
a,ba, b 쌍이 중복되는 프로그램은 입력으로 주어지지 않는다.

문제 풀이

접근1 우선순위 큐를 활용한 시뮬레이션 - O(NlogN)O(N \cdot log N)

풀이 코드

접근1 우선순위 큐를 활용한 시뮬레이션 - O(NlogN)O(N \cdot log N)
import heapq def solution(program): answer = [0 for _ in range(10)] program.sort(key=lambda x: x[1]) memory = [] cur_time = 0 # 프로그램이 아직 남아 있거나 메모리에 실행 대기 중인 프로그램이 있으면 계속 반복 while program or memory: # 현재 실행할 프로그램이 없을 때 시간을 건너뜀 if not memory: cur_time = program[0][1] else: # 메모리에서 우선순위가 가장 높은 프로그램을 꺼냄 process = heapq.heappop(memory) # 프로그램이 대기했던 시간 = 현재 시간 - 호출된 시간 answer[process[0] - 1] += cur_time - process[1] # 실행 시간만큼 현재 시간을 업데이트 cur_time += process[2] # 호출해야 할 프로그램을 메모리에 적재 while program and program[0][1] <= cur_time: heapq.heappush(memory, program.pop(0)) return [cur_time, *answer]
Python
복사