티스토리 뷰

알고리즘/BOJ

[BOJ-1966] 프린터 큐

개발하는 후딘 2020. 3. 17. 23:40
728x90
반응형

https://www.acmicpc.net/problem/1966

 

1966번: 프린터 큐

문제 여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 Queue 자료구조에 쌓여서 FIFO - First In First Out - 에 따라 인쇄가 되게 된다. 하지만 상근이는 새로운 프린터기 내부 소프트웨어를 개발하였는데, 이 프린터기는 다음과 같은 조건에 따라 인쇄를 하게 된다. 현재 Queue의 가장 앞에 있는 문서의 ‘중요도’를

www.acmicpc.net


[풀이]

큐를 이용한 문제이다. 굳이 큐를 넣지 않아도 연결리스트로 풀 수 있는 문제이기도하다.

나는 큐(deque)을 이용하기 보다는 그냥 리스트로 풀었다.

 

일단 나는 중요도번호(1~9)와 문서 위치(0~N)을 리스트원소로했다.

즉 이렇게 말이다 "(문서위치, 중요도)"

 

그리고 리스트의 맨앞원소값을 pop(0)한다. 

pop(0)는 맨왼쪽의 원소를 pop한다 (deque의 popleft()와 같은 기능이나 시간 복잡도가 O(N)이다.)

 

 

그리고 pop한 값을 now라고 하면

큐의 맨왼쪽원소가 now보다 큰원소가 존재한다면 now를 현재큐의 맨 오른쪽에 append시킨다. 

여기서 큐는 연결 리스트 큐(que)이다.

 

반면, 큐의 맨왼쪽원소가 now보다 모두 작다면 now를 printer이라는 임시저장 리스트에 넣는다.

 

예를 들어서 설명해보겠다.

N은 문서의 개수

priority 문서의 중요도를 담은 문서 리스트

M은 내가 몇번째로 뽑혔는지 알고 싶은 문서의 위치

(즉, M=0이면 nums의 인덱스가 0(priority[0])인 문서를 의미한다)

 

(1) N=1, M=0, priority=[5] 

문서의 개수가 한개이면 맨왼쪽의 문서 1개만 프린트하면 되므로 1이나온다.

 

(2) N=4, M=2, priority=[1,2,3,4]

 

 

 

 

 


[코드]

import sys
input=sys.stdin.readline

def find_bigger(now, priority):
    for e in priority:
        if e[1]>now:
            return True
    return False

def solution(N,M,nums):
        #N: 문서개수
        #M: 몇번째로 인쇄됐는지 궁금한 문서 번호
        if N==1: #문서개수가 1개인경우
            return 1
            
        else:
            #중요도 idx는 1~9이다.
            priority=[(idx, val) for idx, val in enumerate(nums)]        
            printer=[]
            while len(que)>0:
                now=priority.pop(0)
                #now[1]보다 큰 값이 que에 존재한다면-> 맨앞값을 큐에넣는다.
                if find_bigger(now[1], priority):
                    priority.append(now)
                else:#now[1]보다 큰값이 존재하지 않으면 -> 맨앞값을 프린터에 넣는다.
                    printer.append(now)
     
            for idx,p in enumerate(printer):
                if p[0]==M:
                    return idx+1
                    

def main():
    T=int(input()) #테스트케이스 개수
    for _ in range(T):
        N, M=map(int, input().strip().split())
        nums=[*map(int, input().strip().split())]
        print(solution(N,M,nums))

if __name__=='__main__':
    main()
                ​

728x90
반응형

'알고리즘 > BOJ' 카테고리의 다른 글

[BOJ-16234] 인구이동  (0) 2020.03.18
[BOJ-1062] 가르침  (0) 2020.03.18
[BOJ-14501] 퇴사  (0) 2020.03.16
[BOJ-1238] 파티  (0) 2020.03.16
[BOJ-10026] 적록색약  (0) 2020.03.15
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함