문제 설명
일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린터를 개발했습니다. 이 새롭게 개발한 프린터는 아래와 같은 방식으로 인쇄 작업을 수행합니다.
사실 위 문장이 난 이해가 잘 안갔었다. 근데 나만 이해를 못했던건 또 아니었다.
이해를 못하는 나같은 사람들을 위해 어느분이 자세히 설명을 해주셨다.
아래의 글을 천천히 읽어보길 바란다.
- 최초의 인쇄 대기목록입니다.
-> (A,2) (B,1) (C,3) (D,2)
-> 인쇄완료 : 없음
- 가장 앞에 있는 문서(A,2)를 꺼내 조건을 적용합니다
나머지 인쇄 대기목록에서 중요도가 더 높은 문서(C,3)가 존재하므로 맨 뒤로 보냅니다.
-> (B,1) (C,3) (D,2) (A,2)
-> 인쇄완료 : 없음
- 가장 앞에 있는 문서(B,1)를 꺼내 조건을 적용합니다
나머지 인쇄 대기목록에서 중요도가 더 높은 문서(C,3)가 존재하므로 맨 뒤로 보냅니다.
-> (C,3) (D,2) (A,2) (B,1)
-> 인쇄완료 : 없음
- 가장 앞에 있는 문서(C,3)를 꺼내 조건을 적용합니다
나머지 인쇄 대기목록에서 중요도가 더 높은 문서가 없으므로 인쇄합니다.
-> (D,2) (A,2) (B,1)
-> 인쇄완료 : (C,3)
- 가장 앞에 있는 문서(D,2)를 꺼내 조건을 적용합니다
나머지 인쇄 대기목록에서 중요도가 더 높은 문서가 없으므로 인쇄합니다.
-> (A,2) (B,1)
-> 인쇄완료 : (C,3) (D,2)
- 가장 앞에 있는 문서(A,2)를 꺼내 조건을 적용합니다
나머지 인쇄 대기목록에서 중요도가 더 높은 문서가 없으므로 인쇄합니다.
-> (B,1)
-> 인쇄완료 : (C,3) (D,2) (A,2)
- 가장 앞에 있는 문서(B,1)를 꺼내 조건을 적용합니다
나머지 인쇄 대기목록에서 중요도가 더 높은 문서가 없으므로 인쇄합니다.
-> 인쇄완료 : (C,3) (D,2) (A,2) (B,1)
- 인쇄 순서는 C D A B 가 됩니다.
(프로그래머스 Typebi님 댓글)
이렇게 순서가 돌아가면서 원하는 location에 도달할 경우에 순서를 리턴하는 방식으로 코드를 짜야 한다.
처음에 순서를 지키긴 했는데 순서를 어떻게 출력해야 하는지를 잘 몰라서 고생좀 했다.
그리고 여러 방면으로 지우고, 쓰고를 반복하다 보니 답이 도출되었다.
리스트로도 큐의 기능을 사용할수 있어서 딱히 import로 불러오지 않았다.
Tip. 리스트의 pop()은 매개변수로 원하는 인덱스의 수를 넣어줄 경우 그 인덱스가 삭제된다. 이거 개꿀이다.
def solution(priorities, location):
d = []
cnt = 0 # 각 프린터할 것들의 인덱스
tmp = 0 # 최댓값 변수
for i in priorities:
d.append((cnt, i))
cnt += 1
result = 0 # 출력된 순서
while len(d) != 0: # d의 원소들이 없어질때까지 돌아감
tmp = 0
for i in d:
if tmp < i[1]:
tmp = i[1]
check = d[0]
if check[1] < tmp:
d.pop(0)
d.append(check)
else:
result += 1
if check[0] == location: # 원했던 로케이션에 맞는 인덱스가 출력 될 시 순서 리턴
return result
d.pop(0) # 그게 아니면 순서 증가시키고 pop()