[프로그래머스] 프린터 [스택/큐] [python] Level2
문제 설명
일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린터를 개발했습니다. 이 새롭게 개발한 프린터는 아래와 같은 방식으로 인쇄 작업을 수행합니다.
1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다.
2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다. 3. 그렇지 않으면 J를 인쇄합니다.
예를 들어, 4개의 문서(A, B, C, D)가 순서대로 인쇄 대기목록에 있고 중요도가 2 1 3 2 라면 C D A B 순으로 인쇄하게 됩니다.
내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 알고 싶습니다. 위의 예에서 C는 1번째로, A는 3번째로 인쇄됩니다.
현재 대기목록에 있는 문서의 중요도가 순서대로 담긴 배열 priorities와 내가 인쇄를 요청한 문서가 현재 대기목록의 어떤 위치에 있는지를 알려주는 location이 매개변수로 주어질 때, 내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 return 하도록 solution 함수를 작성해주세요.
설계 및 구현
접근 방식
deque를 써서 해결 할 수 있다.
priorities가 빌때 까지 max(priorities)를 발견할 시 결과 리스트에 쌓고 삭제한다
발견 못할 시에는 deque.leftpop()과 deque.append()를 통해 제일 뒤로 보내버리면서 돌리면
ex) 두번째 예시
[[9, 2], [1, 3], [1, 4], [1, 5], [1, 0], [1, 1]] |
이런 식으로 쌓을 수 있다. 그 후 인덱스 값을 찾아 몇번 째인지 반환하여 해결 할 수 있다.
my_solution
from collections import deque
def solution(priorities, location):
# 1.
deq = []
answer = []
for i in range(len(priorities)):
deq.append([priorities[i],i])
deq = deque(deq)
# 2.
while deq:
# ①
if deq[0][0] == max(priorities):
priorities.pop(priorities.index(max(priorities)))
answer.append(deq[0])
deq.popleft()
# ②
else:
deq.append(deq[0])
deq.popleft()
# 3.
for i in range(len(answer)):
if answer[i][1] == location:
return i+1
코드 설명
1. priorities의 값과 인덱스값을 쌍으로 deq에 저장한 후 deque화 한다.
2. deq가 빌때 까지 while문을 돌린다.
① 만약 deq[0][0]값이 priorities의 최댓값이라면 answer에 최댓값과 최댓값의 인덱스 값읗 쌓아주고
deq와 priorities에서 해당값을 삭제 해준다.
② 아니라면 deq[0] 값을 deq의 맨뒤로 보내버린다.
이런식 으로 deq가 빌때 까지 최댓값 발견시 answer에 쌓는다.
ex) 두 번째 입출력 예에서 answer에 쌓인 값
[[9, 2], [1, 3], [1, 4], [1, 5], [1, 0], [1, 1]] |
3. answer을 돌며 location에 해당하는 값이 몇번째로 인쇄 되었는지 인덱스 값을 통하여 파악할 수 있다.
return i+1로 몇번째로 인쇄 되었는지 반환하여 해결 할 수 있는 문제 이다!
모범 solution
def solution(priorities, location):
queue = [(i,p) for i,p in enumerate(priorities)]
answer = 0
while True:
print(queue)
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
max() 대신 any()를 사용하여 최댓값인지 확인하는 코드이다.
그리고 하나의 while문 안에서 몇번째 인지도 파악 하고 있는 짧고 기발한 코드이다.
any()는 매개변수로 들어온 조건중 하나라도 참이면 참을 반환하는 함수 이다.
pop(), queue.append(), answer+=1, cur[0]==location을 하나의 while문 안에서 수행 가능한 기발한 코드라는 생각이 든다.
'알고리즘 문제풀이 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 문자열 압축 [2020 KAKAO BLIND RECRUITMENT] [python] (0) | 2020.09.22 |
---|---|
[프로그래머스] 124 나라의 숫자 [연습 문제] [python] (0) | 2020.09.22 |
[프로그래머스] 기능개발 [스택/큐] [python] (0) | 2020.09.22 |
[프로그래머스] 다리를 지나는 트럭 [스택/큐] [python] (0) | 2020.09.22 |
[프로그래머스] 스킬트리 [Summer/Winter Coding2019] [python] (0) | 2020.09.22 |