[Algorithm] D-13 그래프 탐색 알고리즘 : DFS/BFS

Jifrozen·2021년 7월 12일
1

Algorithm

목록 보기
19/70

DFS/BFS

  • 탐색이란 많은 양의 데이터 중에서 원하는 데이터를 찾는 과정을 말한다.
  • 대표적인 그래프 탐색 알고리즘으로는 DFS 와 BFS가 있다.

스택 자료구조

  • 먼저 들어 온 데이터가 나중에 나가는 형식 (선입후출)

  • 입구와 출구가 동일한 형태 시각화

  • 삽입과 삭제 연산으로 구성
    삽입(5) (2) (3) (7) 삭제
    7이 삭제됨

  • 파이썬에서는 list가 스택 자료구조로 사용
    append pop이용

큐 자료구조

  • 먼저 들어 온 데이터가 먼저 나가는 형식 (선입선출)

  • 큐는 입구와 출구가 모두 뚫려 있는 터널과 같은 형태로 시각화

  • 삽입(5) (2) (3) (7) 삭제()
    5삭제

  • 파이썬 큐 구현 deque 사용

재귀함수

  • 자기 자신을 다시 호출하는 함수이다.
  • 깊이 우선 탐색으로 깊은 부분을 우선적으로 탐색하는 알고리즘
  • 스택 자료구조(혹은 재귀 함수)를 이용하며, 구체적인 동작 과정
  1. 탐색 시작 노드를 스택에 삽입하고 방문 처리를 합니다.
  2. 스택의 최상단 노드에 방문하지 않은 인접한 노드가 하나라고 있으면 그 노드를 스택에 넣고 처리합니다. 방문하지 않은 인접 노드가 없으면 스택에서 최상단 노드를 꺼냅니다.
  3. 더 이상 2번의 과정을 수행할 수 없을 때까지 반복합니다.
# DFS 함수 정의
def dfs(graph, v, visited):
    # 현재 노드를 방문 처리
    visited[v] = True
    print(v, end=' ')
    # 현재 노드와 연결된 다른 노드를 재귀적으로 방문
    for i in graph[v]:
        if not visited[i]:
            dfs(graph, i, visited)

# 각 노드가 연결된 정보를 리스트 자료형으로 표현(2차원 리스트)
graph = [
  [],
  [2, 3, 8],
  [1, 7],
  [1, 4, 5],
  [3, 5],
  [3, 4],
  [7],
  [2, 6, 8],
  [1, 7]
]

# 각 노드가 방문된 정보를 리스트 자료형으로 표현(1차원 리스트)
visited = [False] * 9

# 정의된 DFS 함수 호출
dfs(graph, 1, visited)
  • 너비우선탐색으로 그래프에서 가까운 노드부터 우선적으로 탐색하는 알고리즘
  • 큐 자료구조를 이용하며, 구체적인 과정
  1. 탐색 시작 노드를 큐에 삽입하고 방문 처리를 한다.
  2. 큐에서 노드를 꺼낸 뒤에 해당 노드의 인접 노드 중에서 방문하지 않은 노드를 모두 큐에 삽입하고 방문 처리합니다.
  3. 더 이상 2번 과정을 수행할 수 없을때까지 반복
from collections import deque

# BFS 함수 정의
def bfs(graph, start, visited):
    # 큐(Queue) 구현을 위해 deque 라이브러리 사용
    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

# 각 노드가 연결된 정보를 리스트 자료형으로 표현(2차원 리스트)
graph = [
  [],
  [2, 3, 8],
  [1, 7],
  [1, 4, 5],
  [3, 5],
  [3, 4],
  [7],
  [2, 6, 8],
  [1, 7]
]

# 각 노드가 방문된 정보를 리스트 자료형으로 표현(1차원 리스트)
visited = [False] * 9

# 정의된 BFS 함수 호출
bfs(graph, 1, visited)

6개의 댓글

comment-user-thumbnail
2021년 7월 12일

안녕하세요, 김덕우입니다. 2부 문제까지 모두 푸셨군요! 영상이 많이 길었는데 오늘도 수고하셨습니다!! (프로젝트 등은 모두 마무리 됐나요? 고생이 많으십니다!)

1개의 답글
comment-user-thumbnail
2021년 7월 12일

오! 음료수 얼러먹기,미로탈출 문제까지 모두 푸셨군요! 저는 영상도 길어서 보고 정리하는데 꽤나 시간이 많이 걸렸어요! 글 잘 보고 갑니다!오늘도 고생하셨습니다 내일도 파이팅!!

1개의 답글
comment-user-thumbnail
2021년 7월 12일

저번주 바빠 보이셨는데 스터디까지 병행하시느라 정말 고생 많으셨을 것 같아요,, 이번주도 같이 화이팅해요!! 문제까지 푸시고 멋지십니다!!

1개의 답글