짜바(가짜 자바)로 자료구조 알고리즘을 배운 나한테 파이썬 자료구조는 그럭저럭 할만 한듯 하다.
큐 정리좀 하려고 한다.
파이썬에 미리 구현되어 있는 클래스가 있긴한데 나는 만들어서 쓰는거 선호.
https://docs.python.org/ko/3/library/collections.html#collections.deque
collections — Container datatypes
Source code: Lib/collections/__init__.py This module implements specialized container datatypes providing alternatives to Python’s general purpose built-in containers, dict, list, set, and tuple.,,...
docs.python.org
만들어서 하면 시간복잡도는 있는거 쓰는 큐랑 똑같은데 공간복잡도는 처리가 안되더라...(이것도 되는 코드 추천받음)
https://www.acmicpc.net/problem/10845
10845번: 큐
첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지
www.acmicpc.net
여기서 원하는 메소드를 기준으로 제작되었음
일단 코드부터 공개하자면
def __init__(self):
self.q = []
self.cnt = 0
def push_x(self, k):
self.q.append(k)
def pop(self):
length = len(self.q) - self.cnt
if length == 0:
return -1
else:
p_num = self.q[self.cnt]
self.cnt += 1
return p_num
def size(self):
length = len(self.q)-self.cnt
return length
def empty(self):
length = len(self.q) - self.cnt
if length == 0:
return 1
else:
return 0
def front(self):
length = len(self.q) - self.cnt
if length != 0:
return self.q[self.cnt]
else:
return -1
def back(self):
length = len(self.q) - self.cnt
if length != 0:
return self.q[-1]
else:
return -1
장점은 아무래도 내가 짰으니까 나는 사용하기 한참 편하다는 것
단점은 코드가 얼마나 좋은지 나도 잘 모른다는 것...
이제 코드는 대충 이정도 소개하고 큐에 대해 알아보자
Queue
일반적으로 FIFO(First in First Out) 선입선출 많이 얘기한다.
중요한 건 맞다. 먼저 들어간 원소가 먼저 나온다는게 이 자료구조의 포인트고 솔찍히 이거 아니면 얘기할 것도 별로 없다.
그래도 몇가지 생각해 볼게 몇개 있는데 특히 파이썬 list에서는 1번으로 들어온 원소를 삭제시키려면 시간이 오래걸리기 때문에 이를 보완해준다는 점에서 의의를 갖는다.
[0]에 있는 원소를 아무리 잘 삭제시킨다고 해도 O(n)을 피할 수 없기 때문에 어떻게든 큐를 사용할 이유는 충분하다.
나는 이걸 O(1)로 유지시키려고 cnt 만들어서 원소 삭제될 때마다 한칸씩 옮겨주는걸 아이디어라고 냈는데
다 이렇게 하더라 ㅋㅋㅋ
딱히 뭘 글 쓸것도 별로 없고 연산에 따른 시간복잡도 얘기만 마저 하고 끗
자료구조/연산(시간 복잡도) | append(push) | pop(remove) |
Python-list | O(n) | O(1) |
Python-deque | O(1) | O(1) |
Queue | O(1) | O(1) |
2023.8.15 광복절 끝나기 1분전이다.
순국선열들에게 감사의 마음을 남긴다.