반응형

-그래프 탐색 알고리즘 : DFS/BFS

탐색(Search)이란 많은 양의 데이터 중에서 원하는 데이터를 찾는 과정을 말한다.

대표적인 그래프 탐색 알고리즘으로는 DFS와 BFS가 있다.

DFS/BFS는 코딩 테스트에서 매우 자주 등장하는 유형이다.

 

-미리 알아둬야할 알고리즘

스택 : 후입선출

큐 : 선입선출

재귀 함수 : 자기 자신을 다시 호출하는 함수 / 스택을 사용해야 할 때 함수를 연속적으로 호출하면 컴퓨터 메모리 내부의 스택 프레임에 쌓이기 때문에 구현상 스택 라이브러리 대신에 재귀 함수를 이용하는 경우가 많다. 그러므로 DFS 구현 시 재귀함수를 자주 사용한다.

 

-DFS (Depth - First Search) 깊이 우선 탐색

깊은 부분을 우선적으로 탐색하는 알고리즘이다. DFS는 스택 자료구조(혹은 재귀 함수)를 이용하며, 구체적인 동작 과정은 다음과 같다.

  1. 탐색 시작 노드를 스택에 삽입하고 방문 처리를 한다.
  2. 스택의 최상단 노드에 방문하지 않은 인접한 노드가 하나라도 있으면 그 노드를 스택에 넣고 방문처리한다. 방문하지 않은 인접 노드가 없으면 스택에서 최상단 노드를 꺼낸다.
  3. 더 이상 2번의 과정을 수행할 수 없을 때까지 반복한다.

-DFS 소스코드 예제(python)

#각 노드가 연결된 정보를 표현한다.(인덱스 1부터 계산하는게 편해서 0번 인덱스는 비워둔다.)
graph = [[],[2,3,8],[1,7],[1,4,5],[3,5],[3,4],[7],[2,6,8],[1,7]]
#각 노드가 방문된 정보를 표현한다.
visited = [False] * 9

def dfs(graph, v, visited):
  #현재 노드를 방문처리한다.
  visited[v] = True
  print(v, end=' ')
  #현재 노드와 연결된 다른 노드를 재귀적으로 방문한다.
  for i in graph[v]:
    if not visited[i]:
      dfs(graph, i, visited)

dfs(graph, 1, visited)

출력 값

-BFS (Breadth - First Search) 너비 우선 탐색이며, 가까운 노드부터 우선적으로 탐색하는 알고리즘이다.

BFS는 큐 자료구조를 이용하며, 구체적인 동작은 다음과 같다.

  • 탐색 시작 노드를 큐에 삽입하고 방문 처리를 한다.
  • 큐에서 노드를 꺼낸 뒤 해당 노드의 인접 노드 중에서 방문하지 않은 노드를 모두 큐에 삽입 처리한다.
  • 더 이상 2번의 과정을 수행할 수 없을 떄까지 반복합니다.

-BFS 소스코드 예제

from collections import deque
#각 노드가 연결된 정보를 표현한다.(인덱스 1부터 계산하는게 편해서 0번 인덱스는 비워둔다.)
graph = [[],[2,3,8],[1,7],[1,4,5],[3,5],[3,4],[7],[2,6,8],[1,7]]
#각 노드가 방문된 정보를 표현한다.
visited = [False] * 9

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
bfs(graph, 1, visited)

출처 : [한빛미디어] 이것이 취업을 위한 코딩 테스트다 with 파이썬 (나동빈 저)

+ Recent posts