자료ꡬ쑰/πŸ‘‰μ•Œκ³ λ¦¬μ¦˜ - 18

였늘 듀은 κ°•μ˜ λͺ©λ‘

  1. bfs - 2
  2. bfs - 3

bfs κ΅¬ν˜„λ°©λ²•?

bfsλŠ” λŒ€λΆ€λΆ„ FIFOνŠΉμ„±μ„ κ°€μ§„ 큐λ₯Ό μ΄μš©ν•΄μ„œ 많이 κ΅¬ν˜„ν•œλ‹€.
(λ˜λŠ” μž¬κ·€ν•¨μˆ˜)
νλŠ” λ‹€μŒ 탐색지점을 μ €μž₯ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λœλ‹€.

BFSDFS

이 그림을 예둜 듀어보면,

Aμ—μ„œ 탐색을 μ‹œμž‘ν•  것이기에 큐에 Aμ‚½μž…ν•˜κ³  μ‹œμž‘ν•˜κ² λ‹€. 큐 : A
νμ—μ„œ νŒμ„ 톡해 얻은 λ…Έλ“œ A의 μΈμ ‘λ…Έλ“œλ“€μ„ 큐에 λ„£μœΌλ©΄, 큐 : B, C
νμ—μ„œ νŒμ„ 톡해 얻은 λ…Έλ“œ B의 μΈμ ‘λ…Έλ“œλ“€μ„ 큐에 λ„£μœΌλ©΄, 큐 : C, D
νμ—μ„œ νŒμ„ 톡해 얻은 λ…Έλ“œ C의 μΈμ ‘λ…Έλ“œλ“€μ„ 큐에 λ„£μœΌλ©΄, 큐 : D, G, H, I
νμ—μ„œ νŒμ„ 톡해 얻은 λ…Έλ“œ D의 μΈμ ‘λ…Έλ“œλ“€μ„ 큐에 λ„£μœΌλ©΄, 큐 : H, I, E, F
νμ—μ„œ νŒμ„ 톡해 얻은 λ…Έλ“œ G의 μΈμ ‘λ…Έλ“œλ“€μ„ 큐에 λ„£μœΌλ©΄, 큐 : I, E, F
νμ—μ„œ νŒμ„ 톡해 얻은 λ…Έλ“œ H의 μΈμ ‘λ…Έλ“œλ“€μ„ 큐에 λ„£μœΌλ©΄, 큐 : E, F, J
νμ—μ„œ νŒμ„ 톡해 얻은 λ…Έλ“œ I의 μΈμ ‘λ…Έλ“œλ“€μ„ 큐에 λ„£μœΌλ©΄, 큐 : F, J
νμ—μ„œ νŒμ„ 톡해 얻은 λ…Έλ“œ E의 μΈμ ‘λ…Έλ“œλ“€μ„ 큐에 λ„£μœΌλ©΄, 큐 : J
νμ—μ„œ νŒμ„ 톡해 얻은 λ…Έλ“œ F의 μΈμ ‘λ…Έλ“œλ“€μ„ 큐에 λ„£μœΌλ©΄, 큐 :
큐가 λΉ„μ—ˆμœΌλ―€λ‘œ μ’…λ£Œ.

Bμ—μ„œ μΈμ ‘λ…Έλ“œλ₯Ό 큐에 λ„£μ„λ•Œ, Aλ₯Ό μƒλž΅ν–ˆκ³ , Cμ—μ„œλ„ λ§ˆμ°¬κ°€μ§€μ˜€λ‹€.
μ—¬κΈ°μ„œ λ“œλŠ” 생각은 β€œμ™œ μΈμ ‘λ…Έλ“œμ§€λ§Œ 큐에 λ„£μ§€ μ•Šμ•˜μ„κΉŒ?”
이에 λŒ€ν•œ 닡은 이미 λ°©λ¬Έν•œ λ…Έλ“œμ΄κΈ° λ•Œλ¬Έμ— λ‹€μ‹œ λ°©λ¬Έν•  ν•„μš”κ°€ μ—†κ³ ,
ν•œλ²ˆ λ°©λ¬Έν•œ λ…Έλ“œμ˜ μΈμ ‘λ…Έλ“œλ“€μ€ 아직 λ°©λ¬Έν•˜μ§€ μ•Šμ•˜λ”λΌλ„, 큐에 μΆ”κ°€λ˜μ–΄ 있기 λ•Œλ¬Έμ—
μ•žμœΌλ‘œ λ°©λ¬Έν•˜μ—¬ ν•΄λ‹Ή λ…Έλ“œμ˜ μΈμ ‘λ…Έλ“œλ“€μ„ 탐색 ν•  것이기 λ•Œλ¬Έμ΄λ‹€.

κ·Έλ ‡λ‹€λ©΄ bfsλ₯Ό κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄μ„œλŠ”
κ·Έλž˜ν”„κ΅¬μ‘°, 탐색할 λ…Έλ“œλ₯Ό μ €μž₯ν•˜λŠ” 큐, λ°©λ¬Έν–ˆλŠ”μ§€ μ—¬λΆ€λ₯Ό μ €μž₯ν•˜λŠ” 곡간
μ΄λ ‡κ²Œ μ„Έκ°€μ§€κ°€ ν•„μš”ν•˜λ‹€.

κ°•μ˜μ—μ„œλŠ” λ°©λ¬Έμ—¬λΆ€λ₯Ό 큐둜 μ €μž₯ν–ˆμ§€λ§Œ, κ·Έλž˜ν”„μ˜ 각 λ…Έλ“œλ₯Ό ν‚€λ‘œ ν•˜κ³  True/Falseλ₯Ό value둜 ν•˜λŠ” λ”•μ…”λ„ˆλ¦¬λ₯Ό ν†΅ν•΄μ„œ λ°©λ¬Έμ—¬λΆ€λ₯Ό ν‘œν˜„ν•˜κΈ°λ‘œ ν–ˆλ‹€.

bfs κ΅¬ν˜„ (queue)

import queue
graph = {}
graph['A'] = ['B', 'C']
graph['B'] = ['A', 'D']
graph['C'] = ['A', 'G', 'H', 'I']
graph['D'] = ['B', 'E', 'F']
graph['E'] = ['D']
graph['F'] = ['D']
graph['G'] = ['C']
graph['H'] = ['C']
graph['I'] = ['C', 'J']
graph['J'] = ['I']

def BFS(graph, start):
    visited = {node : False for node in graph}
    q = queue.Queue()
    q.put(start)
    visited[start] = True
    while not q.empty():
        cur_node = q.get()
        pq = copy.copy(q)
        print(cur_node, end=" ")
        for node in graph[cur_node]:
            if not visited[node]:
                visited[node] = True
                q.put(node)
BFS(graph, 'A')
  1. 큐에 μ‹œμž‘λ…Έλ“œλ₯Ό μΆ”κ°€ν•œλ‹€
  2. νμ—μ„œ κΊΌλ‚΄κ³  이λ₯Ό ν˜„μž¬λ…Έλ“œλΌκ³  ν•œλ‹€
  3. ν˜„μž¬ λ…Έλ“œμ˜ μΈμ ‘λ…Έλ“œλ“€ 쀑 λ°©λ¬Έν•˜μ§€ μ•Šμ€ λ…Έλ“œλ₯Ό 큐에 μΆ”κ°€ν•œλ‹€
  4. 큐가 λΉ„μ–΄μžˆμ„ λ•ŒκΉŒμ§€ 2~3을 λ°˜λ³΅ν•œλ‹€.

BFSκ²°κ³Ό

κ²°κ³ΌλŠ” 잘 좜λ ₯λœλ‹€.

bfs 큐 λ‚΄μš© 좜λ ₯ κ΅¬ν˜„ (list)

def BFS(graph, start):
    visited = {node : False for node in graph}
    q = [start]
    visited[start] = True
    while q:
        cur_node = q.pop(0)
        print(cur_node)
        for node in graph[cur_node]:
            if not visited[node]:
                visited[node] = True
                q.append(node)
        print("next : ", end="")
        for e in q:
            print(e, end=" ")
        print()

ꡬ쑰λ₯Ό queue.Queueλ₯Ό μ“°λŠ” λ°”λžŒμ— κΉŠμ€λ³΅μ‚¬κ°€ μ•ˆλ˜μ„œ
큐λ₯Ό λ³΅μ‚¬ν•΄μ„œ μ‚¬μš©ν•˜λ©΄ 원본 큐가 λ°”λ€ŒλŠ” λ°”λžŒμ—
μ›λž˜ 있던 μ½”λ“œμ— listλ₯Ό μ΄μš©ν•œ 큐 κ΅¬ν˜„μœΌλ‘œ λ³€κ²½ν–ˆλ‹€.
λ”°λΌμ„œ 큐 λ‚΄μš©μ„ 좜λ ₯ν•  수 있게 λ˜μ—ˆλ‹€.

μœ„μ— bfs의 과정을 μ„€λͺ…ν•˜λ©΄μ„œ λ‚˜νƒ€λ‚Έ 큐 λΆ€λΆ„κ³Ό
μ•„λž˜ μ‚¬μ§„μ—μ„œ next둜 ν‘œμ‹œλœ 큐의 λ‚΄μš© λΉ„κ΅ν•˜λ©΄ λ˜‘κ°™λ‹€.

BFSνλ‚΄μš©

λ§ˆμ§€λ§‰

μ•Šμ΄ 크둬에 고정해놓고 맀일 크둬 ν‚¬λ•Œλ§ˆλ‹€ λ³΄λŠ”λ°
쀑간에 둜그인 풀린지도 λͺ¨λ₯΄κ³  κ°•μ˜ 계속듣닀가 λ‚˜μ€‘μ— ν’€λ¦°κ±° μ•Œκ³  λ‹€μ‹œλ“£λŠ”λ° ν›„ν›„μš°γ…œγ…‡γ… γ… 
덕뢄에 ν•œ κ°•μ˜λ₯Ό 3λ²ˆμ”© λ³Έλ‹€γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹γ…‹

μˆ˜κ°•λ

λŒ“κΈ€λ‚¨κΈ°κΈ°