<문제 설명>
https://programmers.co.kr/learn/courses/30/lessons/42587
중요도까지 고려해서 문서를 출력하는 프린터가 있다. 해당 프린터는 아래의 로직대로 작업을 수행한다.
1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다.
2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다.
3. 그렇지 않으면 J를 인쇄합니다.
현재 대기목록에 있는 문서의 중요도가 순서대로 담긴 배열 priorities와 내가 인쇄를 요청한 문서가 현재 대기목록의 어떤 위치에 있는지를 알려주는 location이 매개변수로 주어질 때, 내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 리턴하면 되는 문제이다.
(중요도는 숫자가 클수록 높다)
입출력의 예는 다음과 같다.
priorities | location | return |
[2, 1, 3, 2] | 2 | 1 |
[1, 1, 9, 1, 1, 1] | 0 | 5 |
<문제 풀이 아이디어>
내가 뽑고 싶은 문서의 위치(location)이 0이 되면 문서가 출력된다고 가정한다.
따라서 location이 0일때, 내가 뽑고자 하는 문서보다 우선순위가 높은 문서가 존재하지 않는다면, 나는 그 문서를 뽑고 해당 문서를 몇번째로 뽑았는지 answer를 출력한다.
만약 location이 0임에도 내가 뽑고자 하는 문서보다 우선순위가 높은 문서가 존재한다면, 내가 뽑을 문서를 제일 뒤에 배치하고(Queue 처럼_location을 현재 문자열의 길이 -1로 설정) 다시 반복문을 돌린다.
그렇다면 location이 0이 아닐 경우, 즉 아직 내가 뽑고자 하는 문서의 순서가 안되었을 경우라면, 위와 마찬가지로 현재 출력 가능한 문서의 우선순위를 확인하고 이 우선순위가 제일 높은 문서라면 문서를 뽑고(대기열에서 지우고_pop(0)) answer +1 을 해준다.
만약 우선순위가 제일 높은 문서가 아니라면 대기열 제일 뒤로 해당 문서를 보내고 역시 answer +1을 해준다.
<문제 풀이 코드>
def solution(priorities, location):
answer = 1
while priorities:
if(location==0):
if(priorities[0]<max(priorities)):
priorities.append(priorities.pop(0))
location = len(priorities)-1
else:
return answer
else:
if(priorities[0]<max(priorities)):
priorities.append(priorities.pop(0))
location -= 1
else:
priorities.pop(0)
location -= 1
answer += 1
'알고리즘' 카테고리의 다른 글
[프로그래머스 lv 3] 이중우선순위큐.java (0) | 2022.04.20 |
---|---|
[프로그래머스 lv 2] 더 맵게.java (0) | 2022.04.14 |
[프로그래머스 lv 1] 체육복.java (0) | 2022.04.08 |
[자료구조] 탐욕법 (그리디 알고리즘 - Greedy algorithm) (0) | 2022.04.07 |
[프로그래머스 lv 3] 가장 먼 노드.py (0) | 2022.04.06 |