본문 바로가기

Algorithm/코딩테스트 고득점 Kit

[고득점 Kit / 스택&큐] 프로세스

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

 

프로그래머스

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

programmers.co.kr

 

 

문제를 보면 다음과 같이 설명이 나와있다.

1. 실행 대기 큐(Queue)에서 대기중인 프로세스 하나를 꺼냅니다.
2. 큐에 대기중인 프로세스 중 우선순위가 더 높은 프로세스가 있다면 방금 꺼낸 프로세스를 다시 큐에 넣습니다.
3. 만약 그런 프로세스가 없다면 방금 꺼낸 프로세스를 실행합니다.
  3.1 한 번 실행한 프로세스는 다시 큐에 넣지 않고 그대로 종료됩니다.

 

사실 위 설명을 그대로 코드로 나타내면 된다.

 

아래의 코드를 보면서 구현 과정을 살펴보자.

from collections import deque

def solution(priorities, location):
    queue = deque([(priority, idx) for idx, priority in enumerate(priorities)])
    order = 0  
    
    while queue:
        current = queue.popleft()
        
        if any(current[0] < p[0] for p in queue):
            queue.append(current)
        else:
            order += 1  
            if current[1] == location:
                return order

 

크게 두가지로 나뉠 수 있는데, 첫번째는 큐를 생성하는 부분이다.

 

queue = deque([(priority, idx) for idx, priority in enumerate(priorities)])
order = 0

 


우선순위와 해당 프로세스의 원래 위치를 튜플로 묶어서 큐에 저장한다.

예를 들어 priorities = [2, 1, 3, 2]라면 큐는 [(2, 0), (1, 1), (3, 2), (2, 3)]이 된다.

 

order는 실행 순서를 기록하는 변수다. 각 프로세스가 실행될 때마다 1씩 증가한다.

 

    while queue:
        current = queue.popleft()
        
        if any(current[0] < p[0] for p in queue):
            queue.append(current)
        else:
            order += 1  
            if current[1] == location:
                return order

 

 

두번째는 프로세스를 비교하고 실행할지 말지를 판단하는 부분이다.

 

        if any(current[0] < p[0] for p in queue):
            queue.append(current)
  • 우선순위 비교: 꺼낸 프로세스보다 높은 우선순위를 가진 프로세스가 큐에 남아 있으면 다시 큐의 끝에 넣는다.

 

        else:
            order += 1  
            if current[1] == location:
                return order
  • 실행: 그렇지 않다면 프로세스를 실행하고, 실행된 프로세스가 우리가 찾고자 하는 프로세스인지 확인한다. 맞다면 그때의 실행 순서를 반환한다.

 

동작과정을 자세히 살펴보자.

 

 

  • 큐 상태: deque([(2, 0), (1, 1), (3, 2), (2, 3)])
    • 첫 번째 프로세스 (2, 0)을 꺼냄. 우선순위 3인 프로세스가 큐에 남아 있으므로 다시 큐의 뒤로 보냄.
  • 큐 상태: deque([(1, 1), (3, 2), (2, 3), (2, 0)])
    • 두 번째 프로세스 (1, 1)을 꺼냄. 우선순위 3인 프로세스가 있으므로 다시 큐의 뒤로 보냄.
  • 큐 상태: deque([(3, 2), (2, 3), (2, 0), (1, 1)])
    • 세 번째 프로세스 (3, 2)을 꺼냄. 우선순위가 가장 높으므로 실행함. order = 1.
    • current[1] == location이므로 1을 반환.

 

다른 사람의 풀이를 봐도 대부분 비슷한 논리다.