[프로그래머스 알고리즘] 프로그래머스 Lv.2: 프린터 / 파이썬 Python3 (스택/큐)
🔔 문제
출처 : https://programmers.co.kr/learn/courses/30/lessons/42587
문제 설명
일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린터를 개발했습니다. 이 새롭게 개발한 프린터는 아래와 같은 방식으로 인쇄 작업을 수행합니다.
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 함수를 작성해주세요.
제한사항
- 현재 대기목록에는 1개 이상 100개 이하의 문서가 있습니다.
- 인쇄 작업의 중요도는 1~9로 표현하며 숫자가 클수록 중요하다는 뜻입니다.
- location은 0 이상 (현재 대기목록에 있는 작업 수 - 1) 이하의 값을 가지며 대기목록의 가장 앞에 있으면 0, 두 번째에 있으면 1로 표현합니다.
입출력 예
priorities | location | return |
---|---|---|
[2, 1, 3, 2] | 2 | 1 |
[1, 1, 9, 1, 1, 1] | 0 | 5 |
입출력 예 설명
예제 #1
문제에 나온 예와 같습니다.
예제 #2
6개의 문서(A, B, C, D, E, F)가 인쇄 대기목록에 있고 중요도가 1 1 9 1 1 1 이므로 C D E F A B 순으로 인쇄합니다.
📝 오랜만…
오랜만의 업로드이다…
새로운 출발을 위해서 준비하게 되어 다시 공부하면서 블로그에 업로드 할 기회가 생겨 기쁘다.몇달 전 처음에 이 문제를 보고 풀어봤는데, 주식가격 문제를 푼 직후에 풀어서 그런지 비교적 잘 풀렸다.
그런데, 분명 코드를 맞게 짠거 같은데 테스트 케이스 하나가 자꾸 틀리는 것이었다.
나중에 봐야겠다고 생각하고, 한 회사에 들어가서 일을 정신없이 하게 되어 잊고 있었다.이 문제를 계속 풀고 싶다고 생각하고 있었기에, 문제를 클릭해보니 그 전까지 풀어놨던게 있었고, 다시 보니 내가 정의를 잘 못 했던 부분이 있었다.
여튼…
이 문제도 주식가격 문제와 마찬가지로 deque을 이용해서 Queue 유형의 문제들을 풀었듯이 접근하였고, 결국 풀 수 있었다.
🔐 해결 (소스 코드)
from collections import deque
def solution(priorities, location):
rank = 0
priorities = deque((v, i) for i, v in enumerate(priorities)) # i or [1] = 문서인덱스, v or [0] = 중요도
while len(priorities):
document = priorities.popleft() # 1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다.
if priorities and max(priorities)[0] > document[0]: # 2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면
priorities.append(document) # J를 대기목록의 가장 마지막에 넣습니다.
else: # 3. 그렇지 않으면, J를 인쇄
rank += 1
if document[1] == location:
break
return rank
😓 후기
갈 길이 아직 많이 멀었다…
여전히 내 실력은 부족하고, 아이디어도 많이 없고, 난이도가 올라갈수록 코드를 잘 짜는 것에 익숙하지 않다는 생각이 든다.
난.. 누구나 필요로 하는 실력 있고, 멋있는 개발자가 되고 싶다.
그리고, 사람들이 일상 속 편리함을 누릴 수 있는 서비스를 개발하는데 기여하고, A부터 Z까지 개발해보고도 싶다.그 목표를 위해서… 앞으로도 계속해서 화이팅!!!
Leave a comment