데이터 간 관계를 표현한 자료구조
graph = [
[0, 1, 0, 1, 0],
[1, 0, 1, 1, 1],
[0, 1, 0, 0, 0],
[1, 1, 0, 0, 1],
[0, 1, 0, 1, 0]
]
def dfs_stack(start):
visited = []
stack = [start]
while stack:
now = stack.pop()
# 이미 방문한 지점이라면 continue
if now in visited:
continue
# 방문하지 않은 지점이라면 방문 표시
visited.append(now)
# 갈 수 있는 곳들을 stack에 추가
# 작은 번호부터 조회하려면 역순으로 순회
# for next in range(4, -1, -1):
for next in range(5):
# 연결이 안되어있다면 continue
if graph[now][next] == 0:
continue
# 방문한 지점이라면 stack에 추가하지 않음
if next in visited:
continue
# 위 조건들을 모두 통과했으면 stack에 넣기
stack.append(next)
# 출력을 위한 반환
return visited
print(*dfs_stack(0)) # 0 3 4 1 2
visited = [0] * 5
def dfs(now):
# 재귀호출 생각해야 할 단계
# 기저 조건
# 들어가기 전 행동
# 함수 호출
# 돌아와서 할 행동
visited[now] = 1 # 현재 지점 방문 표시
print(now, end=' ')
# 인접한 노드들을 방문
for next in range(5):
if graph[now][next] == 0:
continue
if visited[next]:
continue
dfs(next)
dfs(0)
def bfs(start):
visited = [0] * 5
# 먼저 방문 했던 것을 먼저 처리 = queue
queue = [start]
visited[start] = 1
while queue:
# queue의 맨 앞 요소 꺼냄
now = queue.pop(0)
print(now, end=' ')
# 인접 노드를 queue에 추가
for next in range(5):
# 연결이 안되어있다면 continue
if graph[now][next] == 0:
continue
# 방문한 지점이라면 추가 x
if visited[next]:
continue
queue.append(next)
visited[next] = 1
bfs(0)
graph = [
[1, 3],
[0, 2, 3, 4],
[1],
[0, 1, 4],
[1, 3]
]
graph = {
'0': [1, 3],
'1': [0, 2, 3, 4],
'2': [1],
'3': [0, 1, 4],
'4': [1, 3]
}
추후 인접리스트 dfs, bfs 탐색 추가