이른 아침부터 아이유 콘서트 입장을 대기하던 사람이
콘서트장에 가장 먼저 입장해야 한다.
First In, First out
(물론,
from queue import Queue 정의 및 queue = Queue() 선언을 통해
큐 object를 바로 사용할 수 있다.
직접 코드를 보지않고, 원리를 통해 혼자 만들어 봤다.
(개념만 이해한 상태로 혼자 고민하여 코드를 작성하는 과정이 재밌기 때문이다.
그 후에, 사람들이 만든 코드를 바라보는 재미가 있다.)
class Queue: # 큐 클래스 정의하는 부분
def __init__(self):
self.item_list = []
# 이 부분까지 stack 자료구조와 동일하다.
def push(self, data):
self.item_list.append(data)
def delete(self):
# 리스트가 텅 비어있을땐 return
if not self.item_list:
return
else:
# 방법1.
# self.item_list.reverse()
# first_data = self.item_list.pop()
# self.item_list.reverse()
# return first_data
# 방법2.
result = self.item_list[0]
self.item_list.remove(self.item_list[0])
return result
# 방법3. 내장 클래스 큐 사용시
# another way
#return self.item_list.get()
def show(self):
print(self.item_list)
# 큐 선언
queue = Queue()
# 큐에 데이터 입력 (물론 반복문을 통해 넣어도 된다.)
queue.push(5) # queue.item_list = [5]
queue.push(10) # queue.item_list = [5, 10]
queue.push(7) # queue.item_list = [5, 10, 7]
queue.push(89) # queue.item_list = [5, 10, 7, 89]
queue.push(4) # queue.item_list = [5, 10, 7, 89, 4 ]
queue.push(123) # queue.item_list = [5, 10, 7, 89, 4, 123 ]
# 입력된 데이터를 보기
print(f'pushed data result')
queue.show() # queue.item_list
# 데이터 추출 시작(FIFO)
print(f'pop bigins')
for i in range(len(queue.item_list)):
data = queue.delete()
print(data)
self.item_list.reverse()
first_data = self.item_list.pop()
self.item_list.reverse()
return first_data
result = self.item_list[0]
self.item_list.remove(self.item_list[0])
return result
첫 번째 방법보다 코드가 더 간결할 뿐만 아니라, 직관적이며 좀 더 효율적이라고 생각한다.
reverse 메소드는 아무래도 반복문으로 작성되었을 것이기 때문이다.
if not self.item_list: return
return self.item_list.get()
get()메소드를 통해 맨 처음의 데이터를 추출 및 삭제해준다.
큐 역시 굉장히 친숙한 개념이다.
계산대, 편의점, 정류장 등에서의 줄서기 문화 말이다.
자료구조라는 것이 궁극적으로는 설계하는 프로그램에 최적화하는 것이 중요하다고 생각한다.'
'메모리는 적게', '검색은 빠르게'가 모두가 추구하는 목표이자 이상향이라고 생각한다.
그런 면에서 큐는 저장할 데이터가 증가할수록, 메모리 할당의 부담이 있다.
게다가,
내가 찾고자 하는 데이터를 검색하는데 최악의 경우
그게 가장 마지막에 넣은 데이터일 수도 있다.
즉, 빅오는 n인 된다. O(n)