알고리즘
[Python] 프로그래머스 고득점 Kit (스택/큐) : 프린터
ji_iin
2021. 10. 4. 20:23
문제
[ 문제 조건 ]
- priorities : 현재 대기목록에 있는 문서의 중요도가 순서대로 담긴 배열
- location : 내가 인쇄를 요청한 문서가 현재 대기목록의 어떤 위치에 있는지
- return 값 : 내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지
[ 해결순서 ]
- 처음에 문제를 풀 때 잘못 이해했다. 어떻게 이해했냐면 중요도가 중요도가 제일 높은 값을 발견할 때까지 계속 반복해서 앞에 값 뒤로 보내다가 최댓값이 발견되면 해당 인덱스가 몇번째인지 바로 리턴하게 코드를 짰다.
- 이렇게 풀면 프로그래머스에서 제시한 2가지 입출력 예에는 해당이 되지만 실패로 채점이 되고 다른 테스트 케이스에서는 제대로 작동하지 않는다.
- 반례로 priorities=[1,2,8,3,4]이고, location은 4, 출력은 2가 되어야 하지만 내 코드로 작성한다면 출력은 3이 나올 것이다. (* 손풀이 우측하단참고 )
- 그래서 모든 값을 돌리면서 우선순위 높은 값이 발견되면 그 우선순위 인덱스 값을 finish 배열에 저장하고, 기존 배열에서 제거한다.
- 더이상 배열이 없을 때까지 반복하고 우선순위가 높은 값들의 인덱스 번호가 담긴 finish 배열에서 loc위치의 인덱스번호를 리턴한다.

✏️한줄평
: 문제를 읽고도 무슨말인지 모르겠어서 한참 헤맸다. 뭔가 가독성이 떨어진달까.. 심지어 예제도 헷갈리게 우선순위 높은 값이 바로 발견되면 해당 인덱스 값만 출력해도 답이 맞는 케이스들만 제시해놔서 헷갈렸지만 의미있는 문제였다.
코드
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from collections import deque | |
def solution(priorities, location): | |
prlist = [i for i in range(len(priorities))] | |
finish = [] | |
while len(priorities)!= 0: | |
if priorities[0] == max(priorities): | |
finish.append(prlist.pop(0)) | |
priorities.pop(0) | |
else: | |
priorities.append(priorities.pop(0)) #맨 앞 값을 맨뒤로 | |
prlist.append(prlist.pop(0)) #인덱스도 뒤로 | |
print(finish) | |
return finish.index(location) +1 #값 리턴 | |
print(solution([1,2,8,3,4], 4)) | |
# 1차시 실패 -> 문제 잘못 이해 | |
# def solution(priorities, location): | |
# list = priorities | |
# piv = list[0] | |
# for i in range(1, len(list)): | |
# if piv >= list[i]: #기준보다 큰 값이 있다면 | |
# top = list.pop() | |
# list.append(top) | |
# piv = list[0] | |
# if location == 0: | |
# location = len(list)-1 | |
# else: | |
# location -= 1 | |
# else: #기준이 제일 큰 값이라면 | |
# return location | |