λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

πŸ“š Algorithm/Algorithm Note

μ•Œκ³ λ¦¬μ¦˜ - DFS(깊이 μš°μ„  탐색) / BFS(λ„ˆλΉ„ μš°μ„  탐색) Python μ½”λ“œ

κ·Έλž˜ν”„ 탐색 기법

κ·Έλž˜ν”„ : 정점(node)와 κ·Έ 정점을 μ—°κ²°ν•˜λŠ” κ°„μ„ (edge)으둜 이루어진 자료ꡬ쑰이고,

κ·Έλž˜ν”„λ₯Ό νƒμƒ‰ν•˜λŠ” 것은 ν•˜λ‚˜μ˜ μ •μ μœΌλ‘œλΆ€ν„° μ‹œμž‘ν•˜μ—¬ μ°¨λ‘€λŒ€λ‘œ λͺ¨λ“  정점듀을 ν•œ λ²ˆμ”© λ°©λ¬Έν•˜λŠ” 것을 λ§ν•œλ‹€. 

 

DFS(Depth First Search) : 깊이 μš°μ„  탐색

BFS(Breadth First Search) : λ„ˆλΉ„ μš°μ„  탐색

 

 

 

DFS(Depth First Search)

μ΅œλŒ€ν•œ 깊이 λ‚΄λ €κ°„ λ’€, 더 이상 깊이 갈 곳이 없을 경우 μ˜†μœΌλ‘œ 이동

 

1. λͺ¨λ“  λ…Έλ“œλ₯Ό λ°©λ¬Έν•˜κ³ μž ν•˜λŠ” κ²½μš°μ— 이 방법을 선택함

2. 깊이 μš°μ„  탐색(DFS)이 λ„ˆλΉ„ μš°μ„  탐색(BFS)보닀 μ’€ 더 간단함

3. 검색 속도 μžμ²΄λŠ” λ„ˆλΉ„ μš°μ„  탐색(BFS)에 λΉ„ν•΄μ„œλŠ” 느림

 

적용 : 미둜, κΈΈ μ°ΎκΈ°, 경둜의 νŠΉμ§•μ„ μ €μž₯ν•΄μ•Ό ν•˜λŠ” 경우

 

 

 

BFS(Breadth First Search)

μ΅œλŒ€ν•œ λ„“κ²Œ μ΄λ™ν•œ λ‹€μŒ, 더 이상 갈 수 없을 λ•Œ μ•„λž˜λ‘œ 이동

 

1. 주둜 두 λ…Έλ“œ μ‚¬μ΄μ˜ μ΅œλ‹¨ 경둜λ₯Ό μ°Ύκ³  싢을 λ•Œ 이 방법을 선택

 

적용 : κΈΈμ°ΎκΈ°, λΌμš°νŒ…, μ›Ή 크둀러, μ†Œμ…œ λ„€νŠΈμ›Œν¬μ—μ„œ 멀리 떨어진 μ‚¬λžŒ μ°ΎκΈ°, κ·Έλž˜ν”„μ—μ„œ μ£Όλ³€ μœ„μΉ˜ μ°ΎκΈ°

 

 

 

DFS와 BFS의 차이

DFS(깊이 μš°μ„  탐색) BFS(λ„ˆλΉ„ μš°μ„  탐색)
ν˜„μž¬ μ •μ μ—μ„œ 갈 수 μžˆλŠ” μ λ“€κΉŒμ§€ λ“€μ–΄κ°€λ©΄μ„œ 탐색 ν˜„μž¬ 정점에 μ—°κ²°λœ κ°€κΉŒμš΄ 점듀뢀터 탐색
μŠ€νƒ λ˜λŠ” μž¬κ·€ν•¨μˆ˜λ‘œ κ΅¬ν˜„ 큐 μ΄μš©ν•΄μ„œ κ΅¬ν˜„
λ©”λͺ¨λ¦¬κ°€ 적음 λ…Έλ“œκ°€ λ§Žμ„ 수둝 λ©”λͺ¨λ¦¬λ₯Ό 많이 μ†ŒλΉ„
κ·Έλž˜ν”„μ˜ 깊이(depth)κ°€ κΉŠμ„ 수둝 빠름 μ°ΎλŠ” λ…Έλ“œκ°€ 인접할 λ•Œ 유리

 

 

 

κ·Έλž˜ν”„ 탐색 μ˜ˆμ‹œ

좜처 : https://hudi.blog/dfs-bfs/

DFS(깊이 μš°μ„  탐색)

μœ„ κ·Έλž˜ν”„λ₯Ό DFS 둜 νƒμƒ‰ν•˜λ©΄ 1 → 2 → 5 → 8 → 6 → 3 → 4 → 7 μ˜ 순으둜 탐색을 ν•œλ‹€. 

 

 

BFS(λ„ˆλΉ„ μš°μ„  탐색)

μœ„ κ·Έλž˜ν”„λ₯Ό BFS 둜 νƒμƒ‰ν•˜λ©΄ 1 → 2 → 3 → 4 → 5 → 6 → 7 → 8 μ˜ 순으둜 탐색을 ν•œλ‹€. 

 

 

 

Python 으둜 λ‚˜νƒ€λ‚Έ BFS

#BFS - Breadth First Search
#λ„ˆλΉ„ μš°μ„  탐색 : κ°€κΉŒμš΄ λ…Έλ“œλΆ€ν„° 탐색
#큐 자료ꡬ쑰 μ‚¬μš©

from collections import deque


def BFS(graph, start, visited) :
    queue = deque([start])
    
    #ν˜„μž¬ λ…Έλ“œ λ°©λ¬Έ 처리
    visited[start] = True
    
    #큐가 빌 λ•ŒκΉŒμ§€ 반볡
    while queue :
        #νμ—μ„œ ν•˜λ‚˜μ˜ μ›μ†Œλ₯Ό 뽑아 print
        v = queue.popleft()
        print(v, end = ' ')
        
        #아직 λ°©λ¬Έν•˜μ§€ μ•Šμ€ μ›μ†Œλ“€μ„ 큐에 μ‚½μž…
        for i in graph[v] :
            if not visited[i] :
                queue.append(i)
                visited[i] = True
                
visited = [False] * 9

 

 

 

Python 으둜 λ‚˜νƒ€λ‚Έ DFS

#DFS - Depth First Search
#깊이 μš°μ„  탐색 - κΉŠμ€ 뢀뢄을 μš°μ„ μ μœΌλ‘œ 탐색
#μŠ€νƒ 자료ꡬ쑰 μ‚¬μš©

from operator import truediv
visited = [False] * 9

def DFS(graph, v, visited, parent_node=-1) :
    #ν˜„μž¬ λ…Έλ“œλ₯Ό λ°©λ¬Έ 처리

    visited[v] = True # assign current node as
    print(v, end = ' ')
    
    for i in graph[v] :
        if not visited[i] :   # if `i' is not visited
            if DFS(graph, i, visited, v) :
                return True
        elif i != parent_node :    # if `i` is visited, and `i` is not a parent_node
            return True
            
    return False
728x90