1. 문제
https://programmers.co.kr/learn/courses/30/lessons/42586
2. 풀이
2.1. 덱을 이용한 풀이
- 1~9 까지 우선순위마다 값을 다르게 넣기 위한 덱 배열을 생성합니다. 이후 우선순위에 따라서 숫자를 집어 넣습니다.
- 우선순위 높은 덱부터 살펴봅니다. 이전에 살펴본 요소를 last_idx 로 표기해놓고, 해당 idx 이후에 실행될 요소를 찾습니다.
- 이후 큐에 있는 요소들을 순서대로 정답 배열에 집어 넣습니다.
- 정답 배열에서 location에 해당하는 요소를 찾아 정답으로 출력합니다.
from collections import deque
def solution(priorities, location):
answer = []
dequeues = [deque() for _ in range(10)] # 1~9 까지 우선순위마다 값을 다르게 넣기 위한 덱 배열
for i in range(len(priorities)): # 원소 집어 넣기
dequeues[priorities[i]].append(i)
last_idx = -1
# 우선순위 높은 순서부터 덱 살펴보기
for i in range(9, 0, -1):
if len(dequeues[i]) == 0: # 덱 비어있으면 넘어가기
continue
# 큐를 한 바퀴 돌면서 이전 단계에서 가장 마지막에 살펴본 요소와 비교하여 먼저 수행될 idx 선택
for _ in range(len(dequeues[i])):
if last_idx < dequeues[i][0]:
break
dequeues[i].append(dequeues[i][0])
dequeues[i].popleft()
answer.extend(dequeues[i])
last_idx = dequeues[i][-1] # 마지막 idx 갱신
for i, x in enumerate(answer):
if x == location:
return i + 1 # 정답 출력
return -1
2.2. 가장 많은 사람들이 추천한 풀이
- 하나하나 살펴보면서 실제 동작을 구현했습니다.
- 배열 p 대신에 덱을 쓰면 시간이 더 줄어들 것으로 보여집니다.
def solution(p, l):
ans = 0
m = max(p)
while True:
v = p.pop(0)
if m == v:
ans += 1
if l == 0:
break
else:
l -= 1
m = max(p)
else:
p.append(v)
if l == 0:
l = len(p)-1
else:
l -= 1
return ans
PREVIOUS[프로그래머스] 기능개발
NEXT[프로그래머스] 더 맵게