[ALGO] Search (DFS)

Updated:

  • 그래프에서 깊은 부분을 우선적으로 탐색하는 알고리즘
  • 데이터의 개수가 N개인 경우 O(N)
  • 스택 자료구조를 이용
    1. 탐색 시작 노드를 스택에 삽입하고 방문 처리를 한다.
    2. 스택의 최상단 노드에 방문하지 않은 인접 노드가 있으면 그 인접 노드를 스택에 넣고 방문 처리를 한다. 방문하지 않은 인접 노드가 없으면 스택에서 최상단 노드를 꺼낸다.
    3. 2번의 과정을 더 이상 수행할 수 없을 때까지 반복한다.

      tip. ‘방문 처리’는 스택에 한 번 삽입되어 처리된 노드가 다시 삽입되지 않게 체크
      tip. DFS 알고리즘은 통상적으로 노드 번호가 낮은 순서부터 처리하도록 구현!

EX. DFS 예시 (방문 처리된 노드는 회색으로, 현재 처리하는 스택의 최상단 노드는 노란색으로 표현)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

Result : 1-> 2-> 5-> 8-> 4-> 9-> 3-> 7-> 6

code

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,4],
  [1,5],
  [1,7],
  [1,8],
  [2,8,9],
  [7],
  [3,6],
  [4,5],
  [5]
]

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

dfs(graph,1,visited)    # 정의된 DFS 함수 호출
1 2 5 8 4 9 3 7 6

기본 예제 1

문제1

code

n, m = map(int, input().split())

graph = []

# 2차원 리스트의 맵 정보 입력
for i in range(n):
    graph.append(list(map(int, input())))

# DFS로 특정한 노드 방문한 뒤에 연결된 모든 노드 방문
def dfs(x,y):
    if x < 0 or x >=n or y < 0 or y >=m:
        return False
    if graph[x][y] == 0:
        graph[x][y] = 1
        dfs(x-1,y)
        dfs(x+1,y)
        dfs(x,y-1)
        dfs(x,y+1)
        return True
    return False

result = 0

# 모든 위치에 대해서 DFS 진행
for i in range(n):
    for j in range(m):
        if dfs(i,j) == True:
            result += 1

print(result)
3



[출처] 이것이 취업을 위한 코딩 테스트다 with 파이썬 (나동빈 지음)

Tags:

Categories:

Updated:

Leave a comment