책 정리
선입후출구조 (First In Last Out)
또는 후입선출구조(Last In Fisrt Out)
append()
와 pop()
메서드를 이용하면 스택 자료구조와 동일하게 동작append()
: 리스트 가장 뒤쪽에 데이터 삽입pop()
: 리스트의 가장 뒤쪽에서 데이터 꺼냄선입선출 구조 (First In First Out)
append()
popleft()
deque
: 스택과 큐의 장점을 모두 채택한 것으로 데이터를 넣고 빼는 속도가 리스트 자료형에 비해 효율적이며 queue 라이브러리를 이용하는 것보다 더 간단from collections import deque
큐 예제
from collections import deque
# 큐 구현을 위해 deque 라이브러리 사용
queue = deque()
queue.append(5)
queue.append(2)
queue.append(3)
queue.append(7)
queue.popleft()
queue.append(1)
queue.append(4)
queue.popleft()
print(queue) # 먼저 들어온 순서대로 출력
queue.reverse() # 역순으로 바꾸기
print(queue)
결과
deque([3, 7, 1, 4])
deque([4, 1, 7, 3])
노드(Node) 또는 정점(Vertex)
과 간선(Edge)
로 표현인접 행렬(Adjacency Matrix)
인접 리스트(Adjacency List)
연결 리스트
이용해 구현인접 행렬 방식은 모든 관계를 저장하므로 노드 개수가 많을수록 메모리가 불필요하게 낭비
인접 리스트 방식은 연결된 정보만을 저장하기 때문에 메모리를 효율적 사용
def dfs(graph, v, visited):
visited[v]=True
print(v, end=' ')
for i in graph[v]:
if not visited[i]:
dfs(graph, i, visited)
graph=[
[],
[2, 3, 8],
[1, 7],
[1, 4, 5],
[3, 5],
[3, 4],
[7],
[2, 6, 8],
[1, 7]
]
visited = [False]*9
dfs(graph, 1, visited)
출력
1 2 7 6 8 3 4 5
동작방식
1. 탐색 시작 노드를 큐에 삽입하고 방문 처리
2. 큐에서 노드를 꺼내 해당 노드의 인접 노드 중에서 방문하지 않은 노드를 모두 큐에 삽입하고 방문 처리
3. 2번의 과정을 더 이상 수행할 수 없을 때까지 반복
from collections import deque
def bfs(graph, start, visited):
queue = deque([start])
visited[start] = True
while queue:
v=queue.popleft()
print(v, end=' ')
for i in graph[v]:
if not visited[i]:
queue.append(i)
visited[i]=True
graph = [
[],
[2, 3, 8],
[1, 7],
[1, 4, 5],
[3, 5],
[3, 4],
[7],
[2, 6, 8],
[1, 7]
]
visited = [False]*9
bfs(graph, 1, visited)
출력
1 2 3 8 7 4 5 6