https://school.programmers.co.kr/learn/courses/30/lessons/42587
문제를 보면 다음과 같이 설명이 나와있다.
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을 반환.
다른 사람의 풀이를 봐도 대부분 비슷한 논리다.
'Algorithm > 코딩테스트 고득점 Kit' 카테고리의 다른 글
[고득점 Kit / 정렬] K번째수 (0) | 2024.09.09 |
---|---|
[고득점 Kit / 스택&큐] 주식가격 (2) | 2024.09.06 |
[고득점 Kit / 스택&큐] 올바른 괄호 (0) | 2024.09.05 |
[고득점 Kit / 스택&큐] 기능개발 (0) | 2024.09.05 |
[고득점 Kit / 스택&큐] 같은 숫자는 싫어 (0) | 2024.09.04 |