본문 바로가기
알고리즘 문제/프로그래머스_Lv2 도장깨기

[프로그래머스] 프로세스 (Python)

by 스코필 2024. 5. 8.

문제 링크

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

 

프로그래머스

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

programmers.co.kr

 

문제 설명

운영 체제가 다음 규칙에 따라 프로세스를 관리할 경우 프로세스가 몇 번째로 실행되는지 알아내야 한다.

규칙

1. 실행 대기 큐(Queue)에서 대기중인 프로세스 하나를 꺼냅니다.

2. 큐에 대기중인 프로세스 중 우선순위가 더 높은 프로세스가 있다면 방금 꺼낸 프로세스를 다시 큐에 넣습니다.

3. 만약 그런 프로세스가 없다면 방금 꺼낸 프로세스를 실행합니다.

     3-1. 한번 실행한 프로세는 다시 큐에 넣지 않고 그대로 종료합니다.

제한 사항

  • priorities의 길이는 1 이상 100 이하입니다.
    • priorities의 원소는 1 이상 9 이하의 정수입니다.
    • priorities의 원소는 우선순위를 나타내며 숫자가 클 수록 우선순위가 높습니다.
  • location은 0 이상 (대기 큐에 있는 프로세스 수 - 1) 이하의 값을 가집니다
    • priorities의 가장 앞에 있으면 0, 두 번째에 있으면 1 ... 과 같이 표현합니다.

 

✅ Code - 성공

from collections import deque

def solution(priorities, location):
    answer = 0
    q = deque()
    
    for i in range(len(priorities)):
        q.append((priorities[i], i))
    
    while True:
        pri_max = max(item[0] for item in q)
        pri, inx = q.popleft()
        if pri < pri_max:
            q.append((pri, inx))
        else:
            answer += 1
            if inx == location:
                break
        
    return answer

 

※ 참고

from collections import deque

def solution(priorities, location):
    answer = 0
    q = deque()
    
    for i in range(len(priorities)):
        q.append((priorities[i], i))
    
    while True:
        pri, inx = q.popleft()
        if pri < max(item[0] for item in q):    # Queue의 길이가 1일 때, max 에러 발생
            q.append((pri, inx))
        else:
            answer += 1
            if inx == location:
                break
        
    return answer

 

만약, 위의 코드처럼 Queue에서 pop을 하고 난 뒤 우선순위의 최대값을 구하게 된다면

priorities의 최소 길이가 1이기 때문에 max 함수를 통해 최대값을 구하는 과정에서

빈 리스트를 찾게 되므로 에러가 날 수 있기 때문에 주의해야 한다.