프로그래머스 - 프로세스(레벨2)

응애개발자·2023년 6월 17일
0

파이썬 코테

목록 보기
9/11

요약하자면 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를 반환하며 프로그램을 종료시킵니다.

0개의 댓글