[Programmers] 프로그래머스 프린터 lv.2
문제 설명 현재 대기목록에 있는 문서의 중요도가 순서대로 담긴 배열 priorities와 내가 인쇄를 요청한 문서가 현재 대기목록의 어떤 위치에 있는지를 알려주는 location이 매개변수로 주어질 때, 내가 인쇄를 요청한 문서가 몇 번째로 인쇄되는지 return 하도록 solution 함수를 작성해주세요.
- 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다.
- 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다.
- 그렇지 않으면 J를 인쇄합니다.
- 조건
- 현재 대기목록에는 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 |
모든 테스트를 통과한 풀이답안
def solution(priorities, location):
loc = [i for i in range(len(priorities))]
fnl_loc = []
while len(priorities) != 0:
if priorities[0] == max(priorities):
fnl_loc.append(loc.pop(0))
priorities.pop(0)
else:
priorities.append(priorities.pop(0))
loc.append(loc.pop(0))
print(fnl_loc)
print(loc)
return fnl_loc.index(location)+1
우선순위 값에서 max값이 첫 번째 위치에 없으면 pop하고 append해 리스트 끝으로 보낸다. 그리고 중복된 priorities 값이 존재할 수 있으므로 priorities 바뀐 값들의 index를 또한 변경해주어야한다. priorities의 값의 index를 loc이라는 이름의 리스트에 넣어 max값이 첫 번째로 나올 때까지 index값의 위치를 변경한다.
그렇게 반복하다 만약 priorities의 첫 번째값이 max가 나오면 우선순위값이 내림차순일 것이다.
최종적으로 priorities = [3,2,1,1] , loc [2,3,0,1] 우리가 찾고있는 location=2의 값은 3이었고 현재 3의 위치는 첫 번째에 위치해 return 값은 1이다.
내가 실패한 코드
def solution(priorities, location):
answer = 0
fnl_loc = []
queue = [(i,j) for i,j in enumerate(priorities)]
while True:
if queue[0][1] == max(priorities):
break
elif queue[0][1] != max(priorities):
queue.append(queue.pop(0))
return [i for i,j in queue].index(location)+1
enumerate함수를 사용해 구하는 방식도 가능할 것 같아 시도했지만 time out이라는 결과가 나왔다. 짐작으로 for구문이 2번 존재하기 때문이 아닐까 생각했다. 그 부분을 해결하지 못한채 enumerate를 잘 활용한 다른 코드를 발견해 아래에 적어본다.
배울점이 많은 다른 사람 풀이 코드
def solution(priorities, location):
queue = [(i,p) for i,p in enumerate(priorities)]
answer = 0
while True:
cur = queue.pop(0)
if any(cur[1] < q[1] for q in queue):
queue.append(cur)
else:
answer += 1
if cur[0] == location:
return answer
흥미로웠던 점은 any라는 함수였다. 처음 보았는데 이렇게 사용할 수 있다는 것을 알게되어 코드를 하나하나 뜯어보기로 하였다. dequeue라는 함수를 사용하면 시간복잠도가 더 빠르지만 안쓰고도 코딩을 할 수 있다는 점에 집중해보았다.
any는 인자중에 참값이 하나라도 있으면 True를 반환하는 함수이다. 그렇게 첫 번째 값과 두 번째 값을 비교해서 작으면 queue뒤에 append하도록 하였다. 아니라면 첫 번째 값의 index가 찾고있던 location과 같다면 answer를 return하는 코드였다. dequeue함수가 기억이 나지않아 쓰지 못하더라도 이렇게 코드를 쉽고 간결하게 쓸 수 있으면 좋겠다.