Tiny Bunny
본문 바로가기
Algorithm/Baekjoon

[18258] 큐 2 / 파이썬

by LILIRU 2023. 1. 28.

문제

시간제한 / 메모리 제한

입/출력

예제

알고리즘 분류

풀이

  • 리스트를 이용해서 que를 구현했다.
  • 문제의 조건에 따라 그대로 코드를 쳤다.
  • 아 ㅋㅋ개쉽네 제출
  • 결과 :

  • pop(0) 부분이 문제였다.
  • collections 라이브러리의 deque를 사용해서 pop(0) 대신 popleft() 메서드를 사용하였다.
  • 통과!

 

코드

from collections import deque
import sys
input = sys.stdin.readline
que = deque()
N = int(input())
for _ in range(N):
    order = input()
    if order[:2] == "pu":
        push, num = order.split()
        que.append(int(num))
        continue
    elif order[:2] == "po":
        if que:
            print(que.popleft())
        else:
            print(-1)
        continue
    elif order[0] == "s":
        print(len(que))
        continue
    elif order[0] == "e":
        if que:
            print(0)
        else:
            print(1)
        continue
    elif order[0] == "f":
        if que:
            print(que[0])
        else:
            print(-1)
        continue
    elif order[0] == "b":
        if que:
            print(que[-1])
        else:
            print(-1)
        continue

 

새로 알게 된 점

파이썬에서 queue를 구현할 수 있는 방법은 세 가지가 있다.

1. 리스트로 queue 구현

하지만 파이썬의 list는 무작위 접근에 최적화된 자료 구조이기 때문에 pop이나 insert는 성능적으로 불리하다.

시간 복잡도가 O(n)이기 때문에 담고 있는 데이터의 개수가 많아질수록 느려진다.

첫 번째 데이터를 제거하거나 추가하면 그 뒤에 있는 모든 데이터들을 한칸씩 당겨주거나 밀어주어야 하기 때문이다. 그래야 queue[i] 값이 정확함

2. from collections import deque

collections모듈에서 제공하는 deque는 popleft, appendleft같은 메서드를 제공하여 양방향에서 데이터를 추가하고 제거할 수 있다. 이 메서드들은 모두 O(1)의 시간 복잡도를 가지기 때문에 pop()이나 insert()보다 성능이 좋다.

대신 deque는 무작위 접근에 대해서는 O(n)의 시간 복잡도를 가진다. 내부적으로 linked list를 사용하기 때문에 i번째 데이터에 접근하기 위해서는 맨 앞/뒤부터 i번 순회가 필요하기 때문이다.

3.  queue모듈의 Queue클래스

이 방법은 주로 *멀티 쓰레딩 환경에서 사용하고, 내부적으로 **라킹을 지원하여 여러 개의 쓰레드가 동시에 데이터를 추가하거나 삭제할 수 있다.

list, deque와의 차이점은 방향성이 없다는 것이다. 때문에 데이터 추가와 삭제가 하나의 메서드로 처리된다.

데이터를 추가하려면 put(x), 삭제하려면 get() 메서드를 쓰면 된다.

deque처럼 O(1)의 성능을 가지는데 인덱스 접근은 지원하지 않는다.

 

*멀티쓰레드(multi thread): 하나의 프로세스 내에서 둘 이상의 스레드가 동시에 작업을 수행하는 것

**라킹(locking): 둘 이상의 트랜잭션이 공통 데이터에 대해 동시에 접근하지 못하게 잠그는 것

출처: https://www.daleseo.com/python-queue/

 

'Algorithm > Baekjoon' 카테고리의 다른 글

[11727] 2xn 타일링 / 파이썬  (0) 2023.05.27
[15650] N과 M (2) / 파이썬  (1) 2023.01.27
[20044] Project Teams / 파이썬  (2) 2023.01.26

댓글