처음 시도한 코드
from collections import deque
def solution(priorities, location):
answer = []
queue = deque(priorities)
while queue:
print(queue)
process = queue.popleft()
if queue and process < max(queue):
queue.append(process)
else:
answer.append(priorities.index(process))
print(answer)
큐를 이용하려 프로세스 실행 순서를 구현했지만 문제에서 location위치에 있는 프로세스의 실행순서를 구하라고 했기 때문에 우선순위만 주어진 리스트 priorities만 가지고는 고유값을 알 수가 없다.
index를 통해 위치를 찾고자 했지만, 위 사진처럼 같은 우선순위를 가진 프로세스가 존재하면 index는 앞에서부터 인덱스번호를 찾기 때문에 고유값을 알 수 있도록 코드를 수정해야 했다.
정답 코드
from collections import deque
def solution(priorities, location):
answer = [] # 실행된 프로세스
queue = deque((i, j) for i, j in enumerate(priorities))
while queue:
process = queue.popleft()
# 우선순위가 더 높은 프로세스가 하나라도 있으면 큐에 다시 추가 / 아니면 해당 프로세스 실행
if queue and any(process[1] < q[1] for q in queue):
queue.append(process)
else:
answer.append(process)
# location 실행 순서 찾기
for i in answer:
if i[0] == location:
return answer.index(i)+1
프로세스마다 고유한 값을 가질 수 있도록 enumerate를 사용하여 (인덱스번호, 우선순위) 형식으로 큐를 정의하였다.
그런 다음, 문제에서 주어진 규칙에 맞게 프로세스 실행 과정을 코드로 나타내면 된다.
먼저, 큐에서 가장 앞에 위치한 요소를 popleft()로 가져와 process로 저장하고, process와 큐에 있는 요소들의 우선순위를 비교한다.
이때 any를 사용해 하나라도 더 높은 우선순위를 가지는 프로세스가 있는지 판단해 주었다.
process가 큐에 있는 프로세스보다 더 높은 우선순위를 가지면 answer에 추가하여 해당 프로세스는 실행되었음을 나타내준다.
모든 프로세스 실행 과정이 끝나면 location 위치에 존재했던 프로세스가 몇 번째로 실행되었는지 확인하기 위해 answer에서 해당 프로세스의 인덱스를 찾아 리턴해준다.
반응형