요약하자면 location번째 properties가 몇번째로 실행되냐 를 알고싶은겁니다.
아래는 소스코드입니다.
from collections import deque
def solution(pri, loc):
answer = 0
pri = deque(pri)
index = deque([i for i in range(len(pri))])
while True:
maxNum = max(pri)
if maxNum == pri[0]:
if index[0] == loc:
answer+=1
break
answer += 1
pri.popleft()
index.popleft()
maxNum = max(pri)
elif maxNum != pri[0]:
pri.append(pri.popleft())
index.append(index.popleft())
return answer
우선 pop과 popleft에서 속도를 줄이기 위해 리스트를 안쓰고 pri를 deque로 재선언합니다.
문제에서 "예를 들어 프로세스 4개 [A, B, C, D]가 순서대로 실행 대기 큐에 들어있고" 부분을 index로 구현합니다. 이때 A,B,C,D 대신 단순히 0,1,2,3을 내용으로 넣습니다. 이 또한 deque로 생성합니다.
어짜피 무조건 프로그램은 끝이 나게 설계를 해서 while문에 조건을 참으로 해줍니다.
if문으로 항상 priorities 디큐(편의상 pri로 줄여서 씀)의 맨 처음 항목을 확인하고 우선순위가 제일 큰지 확인합니다.
첫번째 if문 설명입니다.
항상 우선순위가 가장 큰 순서로 나가게 되니까 maxNum에 최우선순위를 저장해주고 본인보다 우선순위가 높은 친구들을 전부 pop으로 없애줍니다.
이때 if문으로 만약 맨 앞에 본인이 있게되면 그때 answer에 1을 더하고 while문을 탈출합니다.
elif문 설명입니다.
만약 처음에 있는 항목이 우선순위가 제일 큰게 아니라면 맨 앞에 있는 항목과 그 항목에 해당하는 index에서의 항목(어짜피 맨 앞에있는겁니다.)를 각각의 deque에서 맨뒤로 넣어줍니다.
이렇게 돌다보면 무조건 본인이 맨처음에 오게되고 그때까지 본인보다 앞에 있었던, 우선순위가 높거나 우선순위가 같아도 먼저 실행된 항목이 있을때마다 answer에 1씩 더하고 결국 목표인 loc의 항목이 맨 앞에오게되면 본인차례의 순서가 온것이므로 +1해주고 answer를 반환하며 프로그램을 종료시킵니다.