본문 바로가기
Algorithm

[Programmers]프린터(풀이 성공)

by 전봇대파괴자 2021. 3. 9.

문제

 

다음 규칙에 맞추어 프린터에서 문서가 출력된다.

 

1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다.

2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다. 3. 그렇지 않으면 J를 인쇄합니다.

 

문서의 중요도가 순서대로 담긴 배열 priorities와 특정 문서의 위치 인덱스 location이 주어질 때, 해당 문서가 인쇄되는 순서를 출력하시오.

 

Sample Input :

[1, 1, 9, 1, 1, 1]
0

Sample Output :

5

 

내 코드:

from collections import deque # 큐 라이브러리 불러오기

def solution(priorities, location):
    sample=[0]*len(priorities) # 위치를 기억하기 위한 배열
    sample[location]=1 # location 위치에 1 삽입
    q=deque(priorities) # priorities와 sample을 모두 queue로 변경
    q2=deque(sample)
    count=0 # 출력 카운트
    
    while sum(q2)!=0: # q2의 합이 0이 되는 순간 정지
        if q[0]!=max(q): # q의 첫번째 값과 최댓값 비교
            q.append(q[0]) # q, q2에 똑같이 값 추가, 삭제
            q2.append(q2[0])
            q.popleft()
            q2.popleft()
        else:
            q.popleft()
            q2.popleft()
            count+=1

    return count

 

Comment: 계속적으로 순서가 바뀌는 배열에서 어떻게 인쇄하고 싶은 문서의 처음 위치를 기억하게 만들 수 있는가? 에 답할 수 있다면 이 문제는 풀 수 있습니다. 

 

처음에는 그냥 무식하게, 배열을 중요도 순서대로 내림차순 정렬하고, 그 가운데에서 문서의 중요도 인덱스를 뽑고, 또 그 문서의 중요도와 가장 가까운 수의 인덱스까지 구해서 for문을 돌리는 등의 방법을 써봤지만, 예외처리가 너무 많아지고, 그만큼 코드도 길어져 이건 아니다 싶었습니다. 

 

그러던 와중 중요도 배열과 같은 길이의 배열을 만들어 0으로 채우고, 인쇄하고 싶은 문서의 위치에만 1을 삽입해 위치를 기억하게 만드는 방법이 떠올랐습니다. while문을 사용해 프린터의 규칙대로 배열이 변환되도록 하고, 0으로 채운 배열도 똑같이 변환되도록 하니 쉽게 풀 수 있었습니다. dict 자료형을 고민해볼 수도 있었겠지만, dict 자료형은 key의 중복을 허용하지 않으므로 중복이 있는 테스트 세트를 통과할 수가 없었습니다. 

 

눈에 들어오기 쉬운 풀이라고 생각했지만, 같은 코드가 반복되는 부분이 있어 아쉽습니다. enumerate를 활용했다면 더 깔끔하게 만들 수 있지 않았을까 싶습니다.