DFS

표상우·2021년 11월 28일
0
post-thumbnail

DFS

DFS(Depth-First Search) 즉 깊이 우선 탐색이라고 불린다.

  • 미로를 탐색할 때 한 방향으로 갈 수 있을 때까지 계속 가다가 더 이상 갈 수 없게 되면 다시 가장 가까운 갈림길로 돌아와서 이곳으로부터 다른 방향으로 다시 탐색을 진행하는 방법과 유사하다.
  • 넓게(wide) 탐색하기 전에 깊게(deep) 탐색하는 것이다.
  • 사용하는 경우: 모든 노드를 방문 하고자 하는 경우에 이 방법을 선택한다.
  • 깊이 우선 탐색(DFS)이 너비 우선 탐색(BFS)보다 좀 더 간단하다.
  • 단순 검색 속도 자체는 너비 우선 탐색(BFS)에 비해서 느리다.

Baekjoon 2606: 바이러스

DFS Solution

import sys

read = sys.stdin.readline
dic={}
for i in range(int(read())):
    dic[i+1] = set()
for j in range(int(read())):
    a, b = map(int,read().split())
    dic[a].add(b)
    dic[b].add(a)

def dfs(start, dic):
    for i in dic[start]:
        if i not in visited:
            visited.append(i)
            dfs(i, dic)
visited = []
dfs(1, dic)
print(len(visited)-1)
  • dic = 딕셔너리 형태로 key값에는 컴퓨터, value값에는 key값의 컴퓨터와 연결된 컴퓨터들 추가
  • 컴퓨터들의 연결여부 판단하기 위해 visited 리스트 자료형 생성
  • DFS함수 정의
  • DFS함수를 이용해서 바이러스가 걸리게 되는 컴퓨터 탐색

이 문제는 BFS함수를 이용해서도 풀 수 있다.

BFS Soultion

import sys

read = sys.stdin.readline
dic={}
for i in range(int(read())):
    dic[i+1] = set()
for j in range(int(read())):
    a, b = map(int,read().split())
    dic[a].add(b)
    dic[b].add(a)

def bfs(start, dic):
    queue = [start]
    while queue:
        for i in dic[queue.pop()]:
            if i not in visited:
                visited.append(i)
                queue.append(i)
visited = []
bfs(1, dic)
print(len(visited)-1)

2개의 댓글

comment-user-thumbnail
2021년 12월 1일

억텐 없는 첫 포스팅은 좀 귀하네요..

1개의 답글