♟️ 알고리즘/알고리즘_프로그래머스

[Python][프로그래머스] 프로세스 / 스택, (Lv2)

Jerry_K 2025. 2. 18. 12:49

🖇️ 링크 

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


🗒️ 파이썬 코드 풀이

def solution(priorities, location):
    queue = [(i,p) for i,p in enumerate(priorities)]
    answer = 0
    
    while True : 
        cur = queue.pop(0)
        if any(cur[1] < q[1] for q in queue):
            queue.append(cur)
        else: 
            answer += 1 
            if cur[0] == location:
                return answer

 

시간 복잡도 O( N² )

 

1. deque 라이브러리 없이 풀이한 코드이다. 

  • deque를 안써도 되기는 하지만 pop(0)의 시간복잡도는 O(N)
  • pop()의 시각복잡도는 O(1) 
  • 지금은 pop(0)을 써도 큰 상관은 없어서 쓰지만, 문제 생길 경우 deqeue를 쓰는게 좋음

 

2. 우선 enumerate 함수로 queue를 인덱스와 함께 만들어 준다. 

 

3. any를 통해 pop 된 값이 가장 큰 값인지 비교한다. 

  • 가장 큰 값이 아닌 경우 append를 해줌
  • 가장 큰 값인 경우 answer +=  1을 해줌 

 

4. 가장 큰 값인 경우 if 조건문을 추가해서 정답을 추출한다. 


📌  문제 코멘트 

 

내가 작성한 코드

from collections import deque

def solution(priorities, location):
    visit = deque([i for i in range(len(priorities))])
    priorities = deque(priorities)

    rs, answer = visit[location], 0    

    while priorities :
        if priorities[0] == max(priorities):

            if visit[0] == rs:
                answer += 1
                return answer

            priorities.popleft()
            visit.popleft()
            answer += 1

        else:       
            p_tmp = priorities.popleft()
            v_tmp = visit.popleft()
            priorities.append(p_tmp)
            visit.append(v_tmp)

 

  • 바로 위의 코드는 내가 작성한 코드이다.
  • 이렇게 해도 상관은 없지만, visit라는 리스트를 만들어 가독성을 떨어트린다. 그냥 인덱스로 하면 좋을 것 같다.
  • visit를 만들어 중복되는 코드가 많고, popleft는 한번만 써도 된다. 

 

이 문제를 포스팅 하는 이유는 다음과 같다

  1. any의 활용
  2. pop을 그동안 마지막 부분만 되는 줄 알았던 점 ... (원하는 부분 인덱스로 pop 가능)

📚  문제