코딩테스트/프로그래머스

[프로그래머스][Python] 42587 - 프로세스

solitude12 2024. 7. 10. 14:16

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/42587

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


문제 풀이 과정

from collections import deque


def solution(priorities, location):
    # 초기화
    queue_list = deque(enumerate(priorities))
    answer = []

    while queue_list:
        current = queue_list.popleft()

        # 현재 프로세스보다 우선순위가 높은 프로세스가 있는지 확인
        if any(current[1] < item[1] for item in queue_list):
            queue_list.append(current)  # 우선순위가 높은 프로세스가 있다면 다시 큐에 넣기
        else:
            answer.append(current)  # 그렇지 않으면 프로세스 실행

    # 실행된 순서에서 location에 해당하는 프로세스의 위치 찾기
    for i, process in enumerate(answer):
        if process[0] == location:
            return i + 1  # 위치는 0-based 인덱스이므로 1을 더함


print(solution([2, 1, 3, 2], 2)) # 테스트용

문제에서 제공하는 실행과정을 따라가면서 풀면 간단했다. 다만 파이썬에서 사용하는 방식 중에 any, all에 대해서 이번 기회에 좀 더 알아볼 수 있었던게 좋았다. any와 max의 경우 둘 다 O(n)의 시간복잡도를 가지고 있지만, max는 priorities 리스트 전체를 순회한 후 값을 조회했지만, any는 조건에 해당하는 값이 있을 경우 순회를 중단하기 때문에 미세한 차이지만 더 시간호율적인 코드를 생성할 수 있었다. 또한 any와 all을 통해서 다른 알고리즘을 풀 때도 효율적인 풀이가 가능할 것으로 보여 좋았다.