일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- tableplus
- 개발자공통지식
- 파이썬
- 개발실무
- jsx
- Go언어실무
- 코딩강의
- 개발 영어실력
- HTTP
- 자바
- 알고리즘
- 개발 공식문서
- 실무PT
- 코멘토
- 개발 공식문서 읽기
- 웹서버
- 리액트
- 개발자되기
- golang
- 코멘토실무PT
- 데이터스키마
- 개발공부
- Go언어
- 컴공과개념정리
- postgredb
- 개발공식문서 어려움
- 자료구조
- 스키마모델
- 데이터베이스
- 유데미
- Today
- Total
웹개발일지
[자료구조/알고리즘] 파이썬 리스트와 덱을 활용한 스택과 큐 구현 본문
이 글은 유데미 '컴공선배 알고리즘캠프' 강좌를 듣고 공부한 내용을 정리한 내용입니다.
알고리즘 문제 중 DFS 문제에서 스택과 큐가 활용된다.
스택
파이썬에는 C++처럼 스택이라는 자료형이 따로없어 리스트로 스택을 구현했다. 스택이라는 자료형은 먼저 들어온 자료가 나중에 나가는 선입후출 구조이다. 따라서 아래의 코드를 실행한 결과 마지막에 추가된 789가 먼저 출력되는 것을 확인해볼 수 있다.
s = []
s.append(123)
s.append(456)
s.append(789)
print("size:", len(s))
while len(s) > 0:
print(s[-1])
s.pop(-1)
조금 특이한 것이 -1의 인덱스를 준 것이다. 파이썬에서 음수 인덱스를 쓰면 가장 맨 뒤로 가서 맨 뒤에서부터 역순으로 센다. 따라서 여기서 -1번째 인덱스의 값은 789이며 먼저 pop했기 때문에 789 > 456 > 123 순서로 출력되는 것이다. pop()을 하면 요소를 반환한 후 자료형에서 없앤다.
스택의 실사용 예는 인터넷에서 우리가 웹서핑을 하다가 뒤로가기를 해서 방금 방문했던 페이지로 갈 때이다. 방문 기록을 마지막에 방문한 순서 대로 나오기 때문에 스택을 이용한 구현임을 알 수 있다.
큐
스택과 반대로 첫번째로 들어간 요소가 첫번째로 나온다. (FIFO) 일상생활의 예로 맛집을 기다리는 줄을 생각할 수 있다. 먼저 온 사람이 먼저 줄에서 빠져나오는 구조이다.
from collections import deque
q = deque()
q.append(123)
q.append(456)
q.append(789)
print("size:", len(q))
while len(q) >0:
print(q.popleft()) # 값을 왼쪽에서 뺀다
원래 Queue모듈이 따로 있는데, 얘는 멀티스레드 환경에서 멀티스레드를 고려한 기능을 짰을 때 스레드 safe하도록 구현되어있어 속도가 좀 느리다. 알고리즘 풀 땐 이것이 필요하지 않기 때문에 deque을 쓴다. 덱은 큐의 상위호환 같은 자료구조인데, 큐는 항상 데이터를 뒤로만 넣을 수 있었는데 덱은 맨 앞에서도, 뒤에서도 양쪽으로 넣고 빼고가 가능한 자료구조다. (double-ended Queue의 축약표현)
백준에서 알고리즘 문제를 풀 때 큐를 쓸일이 있다면 deque을 쓰자!
시간복잡도
큐와 스택 모두 삽입/삭제시 N개의 데이터 각각에 대해 따로 해주는 것이 없기 때문에 시간복잡도 O(1)이다.
'자료구조와 알고리즘' 카테고리의 다른 글
Arraylist vs Linkedlist (0) | 2023.01.18 |
---|---|
[백준2420] 여러 값 정수로 입력받기 & 절댓값함수의 사용 - Python (0) | 2023.01.16 |
[자료구조/알고리즘] 맵과 집합 map, set - 파이썬 (0) | 2023.01.12 |
[백준 4101] 입출력과 제어문 사용 문제 - 파이썬 (0) | 2023.01.11 |
[자료구조/알고리즘] 우선순위 큐 Priority Queue (Heap) - 파이썬 (0) | 2023.01.11 |