BFS with python

chanloperยท2024๋…„ 7์›” 19์ผ
0

์ž๋ฃŒ๊ตฌ์กฐ

๋ชฉ๋ก ๋ณด๊ธฐ
9/10

๐Ÿ”ฆ BFS์™€ DFS์˜ ์ฐจ์ด์ 

  • DFS๋Š” ํƒ์ƒ‰ํ•˜๋Š” ์›์†Œ๋ฅผ ์ตœ๋Œ€ํ•œ ๊นŠ๊ฒŒ ๋”ฐ๋ผ๊ฐ€์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์ธ์ ‘ํ•œ ๋…ธ๋“œ ์ค‘ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋ชจ๋“  ๋…ธ๋“œ๋“ค์„ ์ €์žฅํ•ด๋‘๊ณ ,
    "๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ๋„ฃ์€ ๋…ธ๋“œ"๋ฅผ ๊บผ๋‚ด์„œ ํƒ์ƒ‰ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค - > ๊ทธ๋ž˜์„œ ์Šคํƒ(Stack)์„ ์‚ฌ์šฉ

  • BFS๋Š” ํ˜„์žฌ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋ฅผ ๋จผ์ € ๋ฐฉ๋ฌธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    ์ธ์ ‘ํ•œ ๋…ธ๋“œ ์ค‘ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋ชจ๋“  ๋…ธ๋“œ๋“ค์„ ์ €์žฅํ•ด๋‘๊ณ , ๊ฐ€์žฅ ์ฒ˜์Œ์— ๋„ฃ์€ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ด์„œ ํƒ์ƒ‰ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. "๊ฐ€์žฅ ์ฒ˜์Œ์— ๋„ฃ์€ ๋…ธ๋“œ" -> ํ(Queue)๋ฅผ ์‚ฌ์šฉ

๐Ÿ”Ž DFS๊ฐ€ ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์ด๋ผ๋ฉด BFS๋Š” ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์ด๋‹ค.

๊ตฌํ˜„ ๋ฐฉ๋ฒ•
1. ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ํ์— ๋„ฃ์Šต๋‹ˆ๋‹ค.
2. ํ˜„์žฌ ํ์˜ ๋…ธ๋“œ๋ฅผ ๋นผ์„œ visited์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
3. ํ˜„์žฌ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ์™€ ์ธ์ ‘ํ•œ ๋…ธ๋“œ ์ค‘ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ฅผ ํ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
4. 2๋ถ€ํ„ฐ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.
5. ํ๊ฐ€ ๋น„๋ฉด ํƒ์ƒ‰์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

graph = {
    1: [2, 3, 4],
    2: [5],
    3: [5],
    4: [],
    5: [6,7],
    6: [],
    7: [3],
}

ํ๋ฅผ ๋‹ค์‹œ ๊ธฐ์–ตํ•˜์ž ๐Ÿ’ก

https://velog.io/@chanloper/%ED%81%90Queue

ํ๋ฅผ ์ด์šฉํ•œ BFS ๊ตฌํ˜„

def bfs_queue(start):
    visited = [start] # ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๋ฆฌ์ŠคํŠธ, ์‹œ์ž‘ ๋…ธ๋“œ๋กœ ์„ค์ •(์ดˆ๊ธฐํ™”)
    q = deque([start]) # ํ(queue), ์‹œ์ž‘ ๋…ธ๋“œ๋กœ ์ดˆ๊ธฐํ™”๋œ dequq ๊ฐ์ฒด ์ƒ์„ฑ

    while q: # ํ์— ๋ฐฉ๋ฌธํ•  ๋…ธ๋“œ๊ฐ€ ๋‚จ์•„ ์žˆ๋Š” ๋™์•ˆ ๋ฐ˜๋ณต
        node = q.popleft() # ํ์˜ ์™ผ์ชฝ์—์„œ ๋…ธ๋“œ๋ฅผ ํ•˜๋‚˜ ๊บผ๋ƒ„ ( ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ๋…ธ๋“œ )

        for adj in graph[node]: # ํ˜„์žฌ ๋…ธ๋“œ์˜ ์ธ์ • ๋…ธ๋“œ๋“ค์„ ์ˆœํšŒ
            if adj not in visited: # ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ๋ฐฉ๋ฌธ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด
                q.append(adj) # ํ์— ์ธ์ ‘ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€(append)ํ•˜์—ฌ ๋‚˜์ค‘์— ๋ฐฉ๋ฌธ
                visited.append(adj) # ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ

    return visited # ๋ฐฉ๋ฌธํ•œ ์ˆœ์„œ๋Œ€๋กœ ๋…ธ๋“œ๋“ค์„ ๋‹ด์€ visited ๋ฆฌ์ŠคํŠธ ๋ฐ˜ํ™˜

assert bfs_queue(1) == [1, 2, 3, 4, 5, 6, 7]
  • BFS๋Š” ์‹œ์ž‘ ๋…ธ๋“œ์—์„œ ์ธ์ ‘ํ•œ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋จผ์ € ๋ฐฉ๋ฌธํ•œ ํ›„, ๊ทธ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค์˜ ๋˜ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค์„ ๋ฐฉ๋ฌธํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • ํ(Queue)๋ฅผ ์ด์šฉํ•œ BFS๋Š” ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์˜ ํŠน์„ฑ์ƒ ๊ฐ™์€ ๊นŠ์ด์— ์žˆ๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋จผ์ € ๋ฐฉ๋ฌธํ•˜๋ฏ€๋กœ, ์ตœ๋‹จ ๊ฒฝ๋กœ ํƒ์ƒ‰๋“ฑ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • deque ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ์™ผ์ชฝ์—์„œ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ด๊ณ  ์˜ค๋ฅธ์ชฝ์— ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์—ฐ์‚ฐ์„ ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

BFS๋กœ ์„ฌ์˜ ๊ฐœ์ˆ˜ ์ฐพ๊ธฐ
์ฒด๊ฐ ๋‚œ์ด๋„ : โญ๏ธโญ๏ธโญ๏ธโ˜†โ˜†

from collections import deque

def island_bfs(grid):
    # ์ƒ, ํ•˜, ์ขŒ, ์šฐ ๋ฐฉํ–ฅ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐฐ์—ด
    dx = [0, 0, 1, -1]
    dy = [1, -1, 0, 0]

    # ๊ทธ๋ฆฌ๋“œ์˜ ํ–‰๊ณผ ์—ด ๊ธธ์ด
    rows, cols = len(grid), len(grid[0])

    # ์„ฌ์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๋Š” ๋ณ€์ˆ˜ 'cnt'
    cnt = 0

    # ๊ทธ๋ฆฌ๋“œ์˜ ๊ฐ ์…€์„ ํ•˜๋‚˜์”ฉ ํƒ์ƒ‰
    for row in range(rows):
        for col in range(cols):
            # ํ˜„์žฌ ์…€์ด ์œก์ง€('1')๊ฐ€ ์•„๋‹ˆ๋ฉด ๊ฑด๋„ˆ๋œ€
            if grid[row][col] != '1':
                continue

            # ์ƒˆ๋กœ์šด ์„ฌ์„ ๋ฐœ๊ฒฌ, ์„ฌ ๊ฐœ์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œํ‚ด (cnt+=1)
            cnt += 1
            q = deque([row,col]) # ์‹œ์ž‘์ ์„ ํ์— ์ถ”๊ฐ€ํ•˜์—ฌ ์ดˆ๊ธฐํ™”

            while q:
                x, y = q.popleft() # ํ์—์„œ ํ•˜๋‚˜์˜ ์ขŒํ‘œ๋ฅผ ๊บผ๋ƒ„
                for i in range(4): # ์ƒํ•˜์ขŒ์šฐ ๋ฐฉํ–ฅ์— ๋Œ€ํ•ด ํƒ์ƒ‰
                    nx = x + dx[i] # ์ƒˆ๋กœ์šด x ์ขŒํ‘œ ๊ณ„์‚ฐ
                    ny = y + dy[i] # ์ƒˆ๋กœ์šด y ์ขŒํ‘œ ๊ณ„์‚ฐ
                    # ์ƒˆ๋กœ์šด ์ขŒํ‘œ๊ฐ€ ๊ทธ๋ฆฌ๋“œ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๊ฑฐ๋‚˜ ์œก์ง€๊ฐ€ ์•„๋‹ˆ๋ฉด ๊ฑด๋„ˆ๋œ€
                    if nx < 0 or nx >= rows or ny < 0 or ny >= cols or grid[nx][ny] != '1':
                        continue

                    grid[nx][ny] = '0' # ๋ฐฉ๋ฌธํ•œ ์œก์ง€๋ฅผ '0'์œผ๋กœ ํ‘œ์‹œํ•˜์—ฌ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
                    q.append((nx,ny)) # ์ƒˆ๋กœ์šด ์ขŒํ‘œ๋ฅผ ํ์— ์ถ”๊ฐ€ํ•˜์—ฌ BFS ๊ณ„์† ์ง„ํ–‰

            # ํ•œ๋ฒˆ์˜ BFS ํƒ์ƒ‰์ด ๋๋‚˜๋ฉด ํ•ด๋‹น ์„ฌ์˜ ํƒ์ƒ‰์„ ์™„๋ฃŒํ•˜๊ณ  ๋‹ค์Œ ์…€๋กœ ์ด๋™
            
            return cnt # ์„ฌ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜

์ด์ „์— ํ–ˆ๋˜ stack์œผ๋กœ ๊ตฌํ˜„ํ•œ ์„ฌ์˜ ๊ฐœ์ˆ˜ ์ฐพ๊ธฐ์™€ ์œ ์‚ฌํ•˜๋‹ค.

๐Ÿ”ฆ ํ•œ ์ค„์”ฉ ์ฝ”๋“œ๋ฅผ ํ•ด์„ค

  • dx์™€ dy๋Š” ์ƒํ•˜์ขŒ์šฐ ๋ฐฉํ–ฅ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฆฌ์ŠคํŠธ(๋ฐฐ์—ด)์ด๋‹ค.
  • rows์™€ cols๋Š” ๊ทธ๋ฆฌ๋“œ์˜ ํ–‰๊ณผ ์—ด์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.
  • cnt๋Š” ์„ฌ์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๋Š” ๋ณ€์ˆ˜๋‹ค.
  • ์ด์ค‘ ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•ด ๋ชจ๋“  ๊ทธ๋ฆฌ๋“œ์˜ ์…€์„ ํƒ์ƒ‰ํ•œ๋‹ค.
  • if grid[row][col] != '1' : continue ํ˜„์žฌ ์…€์ด ์œก์ง€('1')๊ฐ€ ์•„๋‹ˆ๋ฉด ๋‹ค์Œ ์…€๋กœ ๋„˜์–ด๊ฐ„๋‹ค.
  • ์œก์ง€('1')์ธ ๊ฒฝ์šฐ์—๋งŒ 'cnt'๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๊ณ  BFS๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค.
  • q = deque([(row,col)]) ํ˜„์žฌ ์œก์ง€์˜ ์ขŒํ‘œ๋ฅผ ํ์— ์ถ”๊ฐ€ํ•˜์—ฌ BFS๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
  • while q: ํ์— ๋ฐฉ๋ฌธํ•  ์ขŒํ‘œ๊ฐ€ ๋‚จ์•„ ์žˆ๋Š” ๋™์•ˆ ๋ฐ˜๋ณตํ•œ๋‹ค.
  • x,y = q.popleft() ํ์—์„œ ๊ฐ€์žฅ ์™ผ์ชฝ์— ์žˆ๋Š” ์ขŒํ‘œ๋ฅผ ๊บผ๋‚ด์„œ 'x','y'์— ํ• ๋‹นํ•œ๋‹ค.
  • for i in range(4) ์ƒํ•˜์ขŒ์šฐ ๋ฐฉํ–ฅ์— ๋Œ€ํ•ด ํƒ์ƒ‰ํ•œ๋‹ค.
  • nx = x +dx[i] , ny = y +dy[i] : ์ƒˆ๋กœ์šด ์ขŒํ‘œ๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.
  • ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๊ฑฐ๋‚˜ ์œก์ง€๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ์—๋Š” continue๋ฅผ ํ†ตํ•ด ๋‹ค์Œ ๋ฐ˜๋ณต์œผ๋กœ ๋„˜์–ด๊ฐ„๋‹ค.
  • gird[nx][ny] = '0' ๋ฐฉ๋ฌธํ•œ ์œก์ง€๋ฅผ '0'์œผ๋กœ ํ‘œ์‹œํ•˜์—ฌ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  • q.append((nx,ny) ์ƒˆ๋กœ์šด ์ขŒํ‘œ๋ฅผ ํ์— ์ถ”๊ฐ€ํ•˜์—ฌ BFS๋ฅผ ๊ณ„์† ์ง„ํ–‰ํ•œ๋‹ค.
  • BFS๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ํ•ด๋‹น ์„ฌ์˜ ํƒ์ƒ‰์„ ์™„๋ฃŒํ•˜๊ณ  ๋‹ค์Œ ์…€๋กœ ์ด๋™ํ•˜์—ฌ ๋‹ค์Œ ์„ฌ์„ ํƒ์ƒ‰ํ•œ๋‹ค.
  • ๋ชจ๋“  ๋ฐ˜๋ณต์ด ๋๋‚˜๋ฉด 'cnt'๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์„ฌ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๐Ÿค•

profile
์ด๊ฒƒ ๋ญ์—์š”?

0๊ฐœ์˜ ๋Œ“๊ธ€