문제 설명
일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린터를 개발했습니다. 이 새롭게 개발한 프린터는 아래와 같은 방식으로 인쇄 작업을 수행합니다.
- 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다.
- 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다.
- 그렇지 않으면 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로 표현합니다.
입출력 예
제출 코드
def solution(priorities, location):
loc = [i for i in range(len(priorities))]
final_loc = []
while len(priorities) != 0:
if priorities[0] == max(priorities): # 최고 우선순위일 때, 프린트
final_loc.append(loc.pop(0))
priorities.pop(0)
else:
priorities.append(priorities.pop(0))
loc.append(loc.pop(0))
return final_loc.index(location) + 1
(1) line 2, 3
현재 대기목록에 있는 문서들의 인쇄 순서를 담기 위해 리스트 'loc'를 선언하고, 최종적으로 인쇄되는 순서를 담기 위한 리스트 'final_loc'를 선언한다.
(2) line 5
문서의 중요도가 순서대로 담긴 리스트 'priorities'에서 출력할 때가 되었다면 pop시킬 것이므로 모든 문서들이 pop되어 len(priorities)가 0이 될 때까지 반복한다.
(3) line 6 ~ line 8
만약 리스트 'priorities'의 0번째 원소가 해당 리스트에서 가장 큰 값이라면, 이 문서보다 우선순위가 더 높은 문서는 없는 것이므로 인쇄를 하면 된다. 인쇄하게 될 경우, 해당 문서가 맨 처음에는 원래 몇 번째 문서였는지 번호가 담겨있는 리스트 'loc'에서 해당 문서에 해당하는 0번째 원소를 pop시키며 그 값을 리스트 'final_loc' 맨 뒤에 append한다. 그와 동시에 리스트 'priorities'에서 해당 문서를 없애주기 위해 priorities.pop(0) 해준다.
(4) line 9 ~ line 11
만약 리스트 'priorities'의 0번째 원소가 해당 리스트에서 가장 큰 값이 아니라면, 이 문서는 인쇄할 수 없게 되며 대기열의 맨 마지막 순서로 가야 한다. 중요한 것은 리스트 'priorities'는 물론이고 리스트 'loc'에서의 위치도 맨 뒤로 옮겨야 한다.
(5) line 13
return하는 값은 원소 자리가 아닌, 현실에서 부르는 'n번째'의 개념이다. 그에 따라 최종적으로 인쇄되는 순서를 담은 리스트 'final_loc'의 index(location)에서 1을 더해준 값을 return해준다.
위 과정을 그림으로 표현하면 다음과 같다. 예시는 입출력 예 2번을 사용하였다.
알고자 하는 것은 'priorities 초기 상태의 0번째 인덱스인 작업물이 언제 출력되는지' 이다. 코드의 흐름대로 우선순위에 따라 pop을 시켜 final_loc에 append하거나 다시 priorities 및 loc의 맨 뒤로 append하는 과정을 거치면 최종적으로 final_loc은 [2, 3, 4, 5, 0, 1] 라는 원소가 담겨있을 것이다. 즉, 기존의 두 번째 작업물이 가장 처음 출력되고 그 다음부터는 세 번째 작업물, 네 번째 작업물, ..., 첫 번째 작업물 순으로 출력된다.
우리는 0번째 작업물이 5번째로 출력된다는 것을 return하면 되니 final_loc.index(location) + 1 을 return하면 된다.
Source : https://programmers.co.kr/learn/courses/30/lessons/42587
'PS > 프로그래머스' 카테고리의 다른 글
[프로그래머스][파이썬/Python] 소수 찾기 - level 2 (0) | 2020.03.15 |
---|---|
[프로그래머스][파이썬/Python] (2019 카카오 코딩테스트) 오픈채팅방 (0) | 2020.03.09 |
[프로그래머스][파이썬/Python] 시저 암호 (0) | 2020.03.07 |
[프로그래머스][파이썬/Python] (2018 서머코딩/윈터코딩) 스킬트리 (0) | 2020.03.06 |
[프로그래머스][파이썬/Python] 쇠막대기 (0) | 2020.03.05 |