본문 바로가기
알고리즘/BOJ

[BOJ] 1966번 프린터 큐 / 사용언어 : 파이썬(python)

by 바른 호랑이 2021. 12. 25.
728x90
반응형

※ 문제링크 

 

1966번: 프린터 큐

여러분도 알다시피 여러분의 프린터 기기는 여러분이 인쇄하고자 하는 문서를 인쇄 명령을 받은 ‘순서대로’, 즉 먼저 요청된 것을 먼저 인쇄한다. 여러 개의 문서가 쌓인다면 Queue 자료구조에

www.acmicpc.net

※ 관련개념 

 

큐 (자료 구조) - 위키백과, 우리 모두의 백과사전

 

ko.wikipedia.org

해당문제는 큐를 활용해서 풀어야하는 문제였다. 큐에 대해서 간단하게 설명하면, 선입선출(First In First Out)방식으로 변수들을 삽입하고 추출하는 방식의 자료구조이다. 파이썬에서는 collections의 deque라는 양방향 큐를 사용할 수 있는 함수가 있어 해당 함수를 사용하여 결과를 도출하였다. 해당 라이브러리가 없어도 리스트로 구현을 할 수는 있으나 deque가 속도와 메모리면에서 훨씬 빠를 확률이 높으니 주어진 라이브러리를 적극적으로 활용하는게 좋다. 자세한 풀이방법과 코드는 아래와 같다.

1. 주어진 숫자와 가중치로 리스트를 생성하고, 숫자와 가중치를 매칭하여 2차원 리스트(NW_list)를 생성한다.

2. 가중치 리스트를 내림차순으로 정렬한 후 가중치 리스트와 매칭한 리스트(NW_list)를 deque로 선언해준다.

3. 조건문을 걸어 조건에 맞지 않으면 append와 popleft를 활용하여 맨 앞 요소를 맨 뒤 요소로 위치를 변경해준다. 매칭한 리스트(NW_list)에서 가중치가 최댓값과 같고 요구하는 인덱스 값과 일치하면 반복문을 중지하고 결과값을 출력한다.

 

from collections import deque
T = int(input())
for _ in range(T):
    N, M = map(int, input().split())
    N_list = deque([x for x in range(1, N+1)])
    W_list = list(map(int, input().split()))
    NW_list = []
    for i in range(N):
        NW_list.append([N_list[i], W_list[i]])
    W_list.sort(reverse = True)
    W_list = deque(W_list)
    NW_list = deque(NW_list)
    print(W_list)
    check = 0
    while True:
        print(NW_list, check)
        if NW_list[0][1] == W_list[0] and NW_list[0][0] == M+1:
            NW_list.popleft()
            W_list.popleft()
            check += 1
            break
        elif NW_list[0][1] == W_list[0]:
            NW_list.popleft()
            W_list.popleft()
            check += 1
        else:
            NW_list.append(NW_list[0])
            NW_list.popleft()
    print(check)

 

P.S 개발자가 되기위해 공부중입니다. 잘못된 부분을 댓글로 남겨주시면 학습하는데 큰 도움이 될 거 같습니다.

728x90
반응형

댓글