J1Yun
ZU-TECHLOG
J1Yun
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๐Ÿ“‘ Category (135)
    • Algorithm (61)
      • ๐Ÿ“š Concept (6)
      • ๐Ÿ“˜ Baekjoon Judge (53)
      • ๐Ÿ“— Programmers (2)
    • Computer Science (42)
      • ๐Ÿ”’ Operating System (14)
      • ๐Ÿ“ก Network (15)
      • ๐Ÿ’พ Database (8)
      • ๐Ÿงฉ Design Pattern (4)
      • ๐Ÿ”‘ Security (1)
    • Activities (12)
      • ๐Ÿฆ ๋ฉ‹์Ÿ์ด์‚ฌ์ž์ฒ˜๋Ÿผ 9๊ธฐ (6)
      • ๐Ÿ’ป SW๋งˆ์—์ŠคํŠธ๋กœ 13๊ธฐ (6)
    • Infra (1)
      • โ˜๏ธ AWS (1)
    • Languages (1)
      • ๐Ÿ’™ Python (1)
    • Backend (7)
      • ๐Ÿ”ต Django (4)
      • ๐ŸŸข Node.js (3)
    • Ect. (8)
      • ๐Ÿ’ฌ Talk (0)
      • ๐Ÿ—‚๏ธ ๊ฐœ๋ฐœ์ง๊ตฐ ์ทจ์—… ์ค€๋น„์ž๋ฃŒ (8)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • ํƒœ๊ทธ
  • ๋ฐฉ๋ช…๋ก

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

250x250
hELLO ยท Designed By ์ •์ƒ์šฐ.
J1Yun

ZU-TECHLOG

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰์„ ์œ„ํ•œ DFS์™€ BFS - ํŒŒ์ด์ฌ(Python)
Algorithm/๐Ÿ“š Concept

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰์„ ์œ„ํ•œ DFS์™€ BFS - ํŒŒ์ด์ฌ(Python)

728x90

๊ทธ๋ž˜ํ”„ ํ‘œํ˜„

  ๊ทธ๋ž˜ํ”„๋Š” ๋…ธ๋“œ(Node)์™€ ๊ฐ„์„ (Edge)๋กœ ํ‘œํ˜„๋˜๋ฉฐ ์ด๋•Œ ๋…ธ๋“œ๋ฅผ ์ •์ (Vertex)๋ผ๊ณ ๋„ ํ•œ๋‹ค.

ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๊ทธ๋ž˜ํ”„๋Š” '์ธ์ ‘ ํ–‰๋ ฌ'๊ณผ '์ธ์ ‘ ๋ฆฌ์ŠคํŠธ' 2๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. 

๊ทธ๋ž˜ํ”„ ํ‘œํ˜„

  • ์ธ์ ‘ ํ–‰๋ ฌ : 2์ฐจ์› ๋ฐฐ์—ด๋กœ ๊ทธ๋ž˜ํ”„์˜ ์—ฐ๊ฒฐ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ์‹
    - ๊ฐ ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋œ ํ˜•ํƒœ๋ฅผ ๊ธฐ๋กํ•˜์—ฌ ์ €์žฅ

์ธ์ ‘ ํ–‰๋ ฌ

INF = 999999999  # ๋ฌดํ•œ์˜ ๋น„์šฉ ์„ ์–ธ

# 2์ฐจ์› ๋ฆฌ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์ธ์ ‘ ํ–‰๋ ฌ ํ‘œํ˜„
graph = [
	[0, 7, 5],
    [7, 0, INF],
    [5, INF, 0]
]

print(graph)

 

  • ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ : ๋ฆฌ์ŠคํŠธ๋กœ ๊ทธ๋ž˜ํ”„์˜ ์—ฐ๊ฒฐ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ์‹ 
    - ๋ชจ๋“  ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ ์ €์žฅ

์ธ์ ‘ ๋ฆฌ์ŠคํŠธ

# ํ–‰์ด 3๊ฐœ์ธ 2์ฐจ์› ๋ฆฌ์ŠคํŠธ๋กœ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ํ‘œํ˜„
graph = [[] for _ in range(3)]

# ๋…ธ๋“œ 0์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ (๋…ธ๋“œ, ๊ฑฐ๋ฆฌ)
graph[0].append((1,7))
graph[0].append((2,5))

# ๋…ธ๋“œ 1์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ (๋…ธ๋“œ, ๊ฑฐ๋ฆฌ)
graph[1].append((0,7))

# ๋…ธ๋“œ 2์— ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ ์ •๋ณด ์ €์žฅ (๋…ธ๋“œ, ๊ฑฐ๋ฆฌ)
graph[2].append((0,5))

print(graph)

 

์ธ์ ‘ ํ–‰๋ ฌ VS ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ

  • ์ธ์ ‘ ํ–‰๋ ฌ์€ ๋ชจ๋“  ์—ฐ๊ฒฐ ๊ด€๊ณ„๋ฅผ ์ €์žฅํ•˜๋ฏ€๋กœ ๋…ธ๋“œ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์„์ˆ˜๋ก ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„ but ๋…ธ๋“œ1๊ณผ ๋…ธ๋“œ2์˜ ์—ฐ๊ฒฐ์„ graph[๋…ธ๋“œ1][๋…ธ๋“œ2]๋กœ ๋น ๋ฅด๊ฒŒ ํ™•์ธ ๊ฐ€๋Šฅ
  • ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋Š” ์—ฐ๊ฒฐ๋œ ์ •๋ณด๋งŒ์„ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉ but ์—ฐ๊ฒฐ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์”ฉ ํ™•์ธํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ป๋Š” ์†๋„๊ฐ€ ๋А๋ฆผ
  • ํŠน์ • ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ์ธ์ ‘ ๋…ธ๋“œ๋ฅผ ์ˆœํšŒํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ(DFS, BFS)๋Š” ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ ๋ฐฉ์‹์ด ๋” ์œ ๋ฆฌ

 

DFS ( Depth-First Search )

  DFS (Depth-First Search)๋Š” ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅด๋ฉฐ, ๊ทธ๋ž˜ํ”„์—์„œ ๊นŠ์€ ๋ถ€๋ถ„์„ ์šฐ์„ ์ ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ํŠน์ •ํ•œ ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ํ•˜๋‹ค๊ฐ€ ํŠน์ •ํ•œ ์ƒํ™ฉ์—์„œ ์ตœ๋Œ€ํ•œ ๊นŠ์ˆ™์ด ๋“ค์–ด๊ฐ€์„œ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธํ•œ ํ›„, ๋‹ค์‹œ ๋Œ์•„๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋กœ ํƒ์ƒ‰ํ•œ๋‹ค.

DFS๋Š” ์Šคํƒ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ๊ตฌ์ฒด์ ์ธ ๋™์ž‘ ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
  2. ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ์— ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ ์ธ์ ‘ ๋…ธ๋“œ๋ฅผ ์Šคํƒ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค. ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ธ์ ‘ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด ์Šคํƒ์—์„œ ์ตœ์ƒ๋‹จ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ธ๋‹ค. (pop)
  3. 2๋ฒˆ์˜ ๊ณผ์ •์„ ๋” ์ด์ƒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.
# DFS ๋ฉ”์„œ๋“œ ์ •์˜
def dfs(graph, v, visited):
    visited[v] = True # ํ˜„์žฌ ๋…ธ๋“œ(v) ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
    print(v, end=" ")
    
    # ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ์žฌ๊ท€์ (์Šคํƒ ๊ธฐ๋ฐ˜)์œผ๋กœ ๋ฐฉ๋ฌธ
    for i in graph[v]:
    	if not visited[i]:
    		dfs(graph, i, visited)
            
# ๊ฐ ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋œ ์ •๋ณด๋ฅผ 2์ฐจ์› ๋ฆฌ์ŠคํŠธ๋กœ ํ‘œํ˜„
graph = [
	[],
    [2, 3, 8],
    [1, 7],
    [1, 4, 5],
    [3, 5],
    [3, 4],
    [7],
    [2, 6, 8],
    [1, 7]
]

# ๊ฐ ๋…ธ๋“œ์˜ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ฆฌ์ŠคํŠธ
visited = [False] * 9

# DFS ํ•จ์ˆ˜ ํ˜ธ์ถœ (์‹œ์ž‘ ๋…ธ๋“œ: 1)
dfs(graph, 1, visited)

 

 

BFS ( Breadth-First Search )

  BFS ( Breadth-First Search )๋Š” ๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰์ด๋ผ๊ณ ๋„ ๋ถ€๋ฅด๋ฉฐ, ๊ทธ๋ž˜ํ”„์˜ ์‹œ์ž‘ ๋…ธ๋“œ์™€ ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

BFS๋Š” ํ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ๊ตฌ์ฒด์ ์ธ ๋™์ž‘ ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ํƒ์ƒ‰ ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ํ์— ์‚ฝ์ž…ํ•˜๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
  2. ํ์—์„œ ๋…ธ๋“œ๋ฅผ ํ•˜๋‚˜ ๊บผ๋‚ด ํ•ด๋‹น ๋…ธ๋“œ์™€ ์ธ์ ‘ํ•œ ๋…ธ๋“œ ์ค‘์—์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ฅผ ๋ชจ๋‘ ํ์— ๋„ฃ๊ณ  ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค.
  3. 2๋ฒˆ ๊ณผ์ •์„ ๋” ์ด์ƒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.
from collections import deque

# BFS ๋ฉ”์„œ๋“œ ์ •์˜
def bfs(graph, start, visited):
    queue = deque([start]) # ํ ๊ตฌํ˜„์„ ์œ„ํ•ด deque ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ
    visited[start] = True # ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
    
    # ํ๊ฐ€ empty๋  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
    while queue:
    	v = queue.popleft() # ํ์—์„œ ๋…ธ๋“œ ํ•˜๋‚˜ ๊บผ๋ƒ„
        print(v, end=' ')
        # ๊บผ๋‚ธ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋˜๊ณ  ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋“ค์„ ํ์— ๋ชจ๋‘ ์‚ฝ์ž…
        for i in graph[v]:
        	if not visited[i]:
            	queue.append(i)
                visited[i] = True
                
# ๊ฐ ๋…ธ๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋œ ์ •๋ณด๋ฅผ 2์ฐจ์› ๋ฆฌ์ŠคํŠธ๋กœ ํ‘œํ˜„
graph = [
	[],
    [2, 3, 8],
    [1, 7],
    [1, 4, 5],
    [3, 5],
    [3, 4],
    [7],
    [2, 6, 8],
    [1, 7]
]

# ๊ฐ ๋…ธ๋“œ์˜ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ฆฌ์ŠคํŠธ
visited = [False] * 9

# DFS ํ•จ์ˆ˜ ํ˜ธ์ถœ (์‹œ์ž‘ ๋…ธ๋“œ: 1)
bfs(graph, 1, visited)

 

DFS / BFS ๋ฌธ์ œ ์œ ํ˜•

  • ๊ทธ๋ž˜ํ”„์˜ ๋ชจ๋“  ์ •์ ์„ ๋ฐฉ๋ฌธํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ
    • DFS/BFS ๋‘ ๋ฐฉ๋ฒ• ์ค‘ ์–ด๋А ๊ฒƒ์„ ์‚ฌ์šฉํ•ด๋„ ๋ฌด๋ฐฉํ•˜์ง€๋งŒ ํ•œ ์ •์ ๊ณผ ์—ฐ๊ฒฐ๋œ ๋ชจ๋“  ์ •์ ์„ ๋‹ค ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค๋ฉด DFS๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ 
  • ๊ฒฝ๋กœ์˜ ํŠน์ง•์„ ์ €์žฅํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ์ˆซ์ž๊ฐ€ ์ ํ˜€์žˆ๋Š” 1์—์„œ 10๊นŒ์ง€ ๊ฐ€๋Š” ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•  ๋•Œ ๊ฐ™์€ ์ˆซ์ž๋ฅผ ์ง€๋‚˜์˜ค๋ฉด ์•ˆ๋œ๋‹ค๋Š” ์กฐ๊ฑด์ด ์žˆ๋Š” ๋ฌธ์ œ์™€ ๊ฐ™์ด ๊ฒฝ๋กœ์˜ ํŠน์ง•์„ ์ €์žฅํ•ด์•ผํ•  ๊ฒฝ์šฐ์—๋Š” DFS๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๋ฌธ์ œ
    • a์ •์ ๋ถ€ํ„ฐ b์ •์ ๊นŒ์ง€ ๊ฐ€๋Š” ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” BFS๊ฐ€ ์œ ๋ฆฌํ•˜๋‹ค. DFS๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ์ฒ˜์Œ ๋ฐœ๊ฒฌํ•œ ๊ฒฝ๋กœ๊ฐ€ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ผ๋Š” ๋ณด์žฅ์ด ์—†์ง€๋งŒ BFS๋Š” ๊ฐ€์žฅ ๋จผ์ € ์ฐพ์•„๋‚ธ ๊ฒฝ๋กœ๊ฐ€ ๊ณง ์ตœ๋‹จ๊ฑฐ๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
728x90

'Algorithm > ๐Ÿ“š Concept' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[์ž๋ฃŒ๊ตฌ์กฐ] ๋‹จ์ˆœ/์›ํ˜•/์ด์ค‘ ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ(Linked List) ๊ตฌํ˜„ - ํŒŒ์ด์ฌ(Python)  (0) 2023.03.07
[์ž๋ฃŒ๊ตฌ์กฐ] ์šฐ์„ ์ˆœ์œ„ ํ(Priority Queue/Heapq) ๊ตฌํ˜„ - ํŒŒ์ด์ฌ(Python)  (0) 2021.08.29
[์•Œ๊ณ ๋ฆฌ์ฆ˜] ๊ธฐ์ค€์— ๋”ฐ๋ผ ์ •๋ ฌ(sort/sorted) - ํŒŒ์ด์ฌ(Python)  (0) 2021.08.29
[์•Œ๊ณ ๋ฆฌ์ฆ˜] ๋ฒ”์œ„๋ฅผ ๋ฐ˜์”ฉ ์ขํ˜€๊ฐ€๋Š” ์ด์ง„ ํƒ์ƒ‰ - ํŒŒ์ด์ฌ(Python)  (0) 2021.07.31
[์ž๋ฃŒ๊ตฌ์กฐ] ์Šคํƒ(Stack)๊ณผ ํ(Queue) - ํŒŒ์ด์ฌ(Python)  (0) 2021.07.11
    'Algorithm/๐Ÿ“š Concept' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€์ด๋‹ค
    • [์ž๋ฃŒ๊ตฌ์กฐ] ์šฐ์„ ์ˆœ์œ„ ํ(Priority Queue/Heapq) ๊ตฌํ˜„ - ํŒŒ์ด์ฌ(Python)
    • [์•Œ๊ณ ๋ฆฌ์ฆ˜] ๊ธฐ์ค€์— ๋”ฐ๋ผ ์ •๋ ฌ(sort/sorted) - ํŒŒ์ด์ฌ(Python)
    • [์•Œ๊ณ ๋ฆฌ์ฆ˜] ๋ฒ”์œ„๋ฅผ ๋ฐ˜์”ฉ ์ขํ˜€๊ฐ€๋Š” ์ด์ง„ ํƒ์ƒ‰ - ํŒŒ์ด์ฌ(Python)
    • [์ž๋ฃŒ๊ตฌ์กฐ] ์Šคํƒ(Stack)๊ณผ ํ(Queue) - ํŒŒ์ด์ฌ(Python)
    J1Yun
    J1Yun
    ๊ฐœ๋ฐœ ๊ด€๋ จ ๊ธฐ์ˆ  ๋ฐ ๊ณต๋ถ€ ๋‚ด์šฉ ๊ธฐ๋ก์žฅ

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”