๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป ์ฝ”๋”ฉํ…Œ์ŠคํŠธ/์•Œ๊ณ ๋ฆฌ์ฆ˜

๊นŠ์ด์šฐ์„ ํƒ์ƒ‰(DFS), ๋„ˆ๋น„์šฐ์„ ํƒ์ƒ‰ (BFS) - python์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ

by ๋ฝ€์งœ๊ผฌ 2025. 3. 27.
728x90
๋ฐ˜์‘ํ˜•

* ์ˆ˜์ •

๊ทธ๋Ÿฐ๋ฐ ์ด ์ฝ”๋“œ, ์–‘๋ฐฉํ–ฅ ๋ฆฌ์ŠคํŠธ์ธ ๊ฒฝ์šฐ ๋ฐฉ๋ฌธํ–ˆ๋˜๊ณณ์„ ๋˜ ๋ฐฉ๋ฌธํ•ด๋ฒ„๋ฆฌ๋Š” ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋‹ค.

 

๊ทธ๋ž˜์„œ ์–‘๋ฐฉํ–ฅ ๋ฆฌ์ŠคํŠธ์ธ ๊ฒฝ์šฐ, ๋ฐฉ๋ฌธํ–ˆ๋˜๊ณณ์„ ๋˜ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋ฅผ ๋„ฃ์—ˆ๋‹ค.

# ์ •์  ๊ฐœ์ˆ˜ N, ๊ฐ„์„  ๊ฐœ์ˆ˜ M, ํƒ์ƒ‰ ์‹œ์ž‘ ๋ฒˆํ˜ธ V
N, M, V = map(int, input().split())

edgeList = []
graph = [[] for vertex in range(N+1)]

for i in range(M):
    e0, e1 = map(int, input().split())
    edgeList.append((e0, e1))

for edge in edgeList:
    graph[edge[0]].append(edge[1])
    graph[edge[1]].append(edge[0])

for i in range(len(graph)):
    graph[i].sort(reverse=True)

print(graph)

#DFS
def DFS(graph, V) :
    visited = []
    stack = [V]

    while stack :
        current = stack.pop()

        if current in visited:  # ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋Š” ๋ฌด์‹œ
            continue
     
        for n in graph[current]:
            if not n in visited:
                stack.append(n)
        visited.append(current)
   
    return visited

print(DFS(graph, V))

 

๊นŠ์ด์šฐ์„ ํƒ์ƒ‰(DFS)

1. ์šฐ์„  ์ •์  ๋ฆฌ์ŠคํŠธ๊ฐ€ ํ•˜๋‚˜ ํ•„์š”ํ•˜๋‹ค.

vertexList = [’0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ’6’]

 

2. ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋Š”๊ฑฐ ๋ฆฌ์ŠคํŠธ ์•ˆ์˜ ๋ฆฌ์ŠคํŠธ๋กœ ํ‘œํ˜„

0์—์„œ 1๊ฐ€๋Š”๊ฑฐ, 0์—์„œ 2๊ฐ€๋Š”๊ฑฐ, 1์—์„œ 0๊ฐ€๋Š”๊ฑฐ, 1์—์„œ 3๊ฐ€๋Š”๊ฑฐ

edgeList = [(0,1), (0,2), (1,0), (1,3), (2,0), (2,4), (2,5), (3,1), (4,2), (4,6), (5,2), (6,4) ]

 

3. ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ ๋‹ค → ์ •์ ๋ฆฌ์ŠคํŠธ์™€ edgeList๋ฅผ ์ด์šฉํ•ด์„œ ๋ฆฌ์ŠคํŠธ์•ˆ์˜ ๋ฆฌ์ŠคํŠธ๋กœ ๋งŒ๋“ค๋ฉด ๋œ๋‹ค.

adjacencyList = [[] for vertex in vertexList]

 

# vertex๋Š” ๋ณ€์ˆ˜์ž„. ๊ทธ๋ƒฅ List ๋งŒํผ ๋นˆ ๋ฆฌ์ŠคํŠธ [] ์ƒ์„ฑํ•˜๋Š”๊ฑฐ

for edge in edgeList:
    adjacencyList[edge[0]].append(edge[1])

 

# ์ธ๋ฑ์Šค edge[0]๋ฒˆ์— edge[1]์˜ ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๋Š”๊ฒƒ.

# ๊ทธ๋Ÿฌ๋ฉด ๋งŒ๋“ค์–ด์ง„ ๊ฒฐ๊ณผ๋Š” ์ •์ ์ธ๋ฑ์Šค์˜ ๋ฆฌ์ŠคํŠธ ์•ˆ์— ์—ฐ๊ฒฐ๋œ ์ •์ ์ด ๋“ค์–ด๊ฐ€๋Š”๊ผด.

[[1, 2], [0, 3], [0, 4, 5], [1], [2, 6], [2], [4]]
# 0๋ฒˆ ์ •์ ์— 1,2 ์—ฐ๊ฒฐ
# 1๋ฒˆ ์ •์ ์— 0,3 ์—ฐ๊ฒฐ

 

4. DFS ์‹คํ–‰ ์ฝ”๋“œ

์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๋ฉด DFS๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

์Šคํƒ ์ค€๋น„, current๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค.

 

0์ด ์ฒ˜์Œ ์Šคํƒ์— ๋“ค์–ด๊ฐ„๋‹ค → 0์„ popํ•œ๋‹ค. → 0์˜ ์ด์›ƒ๋“ค 1,2๋ฅผ ์Šคํƒ์— ๋„ฃ๋Š”๋‹ค. → 0์ด ๋ฐฉ๋ฌธ๋˜์—ˆ๋‹ค๊ณ  ํ‘œ์‹œํ•œ๋‹ค.

๊ทธํ›„ 2๋ฅผ popํ•œ๋‹ค → 2 ์˜†์—์žˆ๋Š” ์ด์›ƒ๋“ค 4,5๋ฅผ ์Šคํƒ์— ๋„ฃ๋Š”๋‹ค. (๋ฐฉ๋ฌธ๋˜์—ˆ๋‹ค๊ณ  ํ‘œ์‹œ๋œ๊ฑฐ ์ œ์™ธ) → 2๊ฐ€ ๋ฐฉ๋ฌธ๋˜์—ˆ๋‹ค๊ณ  ํ‘œ์‹œํ•œ๋‹ค.

5๋ฅผ popํ•œ๋‹ค → 5 ์˜†์— ์žˆ๋Š” ์ด์›ƒ๋“ค ์—†์Œ

4๋ฅผ popํ•œ๋‹ค → 4์˜ ๊ทผ์ ‘ vertex๋ฅผ ์Šคํƒ์— ๋„ฃ๋Š”๋‹ค (๋ฐฉ๋ฌธ๋˜์—ˆ๋‹ค ํ‘œ์‹œํ•œ 2 ์ œ์™ธ) → 4๊ฐ€ ๋ฐฉ๋ฌธ๋˜์—ˆ๋‹ค๊ณ  ํ‘œ์‹œํ•œ๋‹ค.

๋ฐ˜๋ณต..

def DFS() :
    visitedVertex = []
    stack = [0]
    while stack:
        current = stack.pop()
        for neighbor in adjacencyList[current]:
            if not neighbor in visitedVertex:
                stack.append(neighbor)
        visitedVertex.append(current)
    return visitedVertex

 

์–ด๋””์— ์‚ฌ์šฉ๋ ๊นŒ? → ์ฒด์Šค์˜ ์ˆ˜, ๊ทธ๋ž˜ํ”„๊ฐ€ ์ฃผ์–ด์ง€๊ณ  ๊ทธ๋ž˜ํ”„ ์•ˆ์— ์‚ฌ์ดํด์ด ์žˆ๋Š”์ง€ ์—†๋Š”์ง€

 

์ตœ์ข… ์ž‘์„ฑ ์ฝ”๋“œ

vertexList = ['0', '1', '2', '3', '4', '5', '6']

edgeList = [(0,1), (0,2), (1,0), (1,3), (2,0), (2,4), (2,5), (3,1), (4,2), (4,6), (5,2), (6,4) ]

# vertex๋Š” ๋ณ€์ˆ˜์ž„. ๊ทธ๋ƒฅ List ๋งŒํผ ๋นˆ ๋ฆฌ์ŠคํŠธ [] ์ƒ์„ฑํ•˜๋Š”๊ฑฐ
adjacencyList = [[] for vertex in vertexList]

for edge in edgeList:
    adjacencyList[edge[0]].append(edge[1])

# ์ธ๋ฑ์Šค edge[0]๋ฒˆ์— edge[1]์˜ ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๋Š”๊ฒƒ.
# ๊ทธ๋Ÿฌ๋ฉด ๋งŒ๋“ค์–ด์ง„ ๊ฒฐ๊ณผ๋Š” ์ •์ ์ธ๋ฑ์Šค์˜ ๋ฆฌ์ŠคํŠธ ์•ˆ์— ์—ฐ๊ฒฐ๋œ ์ •์ ์ด ๋“ค์–ด๊ฐ€๋Š”๊ผด.

def DFS() :
    visitedVertex = []
    stack = [0]
    while stack:
        current = stack.pop()
        for neighbor in adjacencyList[current]:
            if not neighbor in visitedVertex:
                stack.append(neighbor)
        visitedVertex.append(current)
    return visitedVertex

print(DFS())

 


๋„ˆ๋น„์šฐ์„ ํƒ์ƒ‰(BFS)

1~3๋ฒˆ์€ ๋™์ผํ•˜๋‹ค.

 

4. BFS ์‹คํ–‰์ฝ”๋“œ

 

ํ๊ฐ€ ์žˆ์–ด์•ผํ•œ๋‹ค.

0 → 0์˜ ์ด์›ƒ 1,2 ํ์— ๋“ค์–ด๊ฐ → 1 ๋‚˜์˜ด → 1์˜ ์ด์›ƒ 3 ํ์— ๋“ค์–ด๊ฐ → 2 ๋‚˜์˜ด

 

์–ด๋””์— ์‚ฌ์šฉ๋ ๊นŒ? ์ตœ๊ทผ์ ‘ ๊ฑฐ๋ฆฌ ๊ตฌํ• ๋•Œ - ๋‹ค์ต์ŠคํŠธ๋ผ๋„ BFS์ด๋‹ค.

def BFS():
    visitedList = []
    queue = [0]

    while queue:
        current = queue.pop()
        for neigbor in adjacencyList[current]:
            if not neigbor in visitedList:
                queue.insert(0, neigbor)
        visitedList.append(current)
    return visitedList

print(BFS())

 

์ตœ์ข… ์ž‘์„ฑ ์ฝ”๋“œ

vertexList = ['0', '1', '2', '3', '4', '5', '6']

edgeList = [(0,1), (0,2), (1,0), (1,3), (2,0), (2,4), (2,5), (3,1), (4,2), (4,6), (5,2), (6,4) ]

# vertex๋Š” ๋ณ€์ˆ˜์ž„. ๊ทธ๋ƒฅ List ๋งŒํผ ๋นˆ ๋ฆฌ์ŠคํŠธ [] ์ƒ์„ฑํ•˜๋Š”๊ฑฐ
adjacencyList = [[] for vertex in vertexList]

for edge in edgeList:
    adjacencyList[edge[0]].append(edge[1])

# ์ธ๋ฑ์Šค edge[0]๋ฒˆ์— edge[1]์˜ ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๋Š”๊ฒƒ.
# ๊ทธ๋Ÿฌ๋ฉด ๋งŒ๋“ค์–ด์ง„ ๊ฒฐ๊ณผ๋Š” ์ •์ ์ธ๋ฑ์Šค์˜ ๋ฆฌ์ŠคํŠธ ์•ˆ์— ์—ฐ๊ฒฐ๋œ ์ •์ ์ด ๋“ค์–ด๊ฐ€๋Š”๊ผด.

def BFS():
    visitedList = []
    queue = [0]

    while queue:
        current = queue.pop()
        for neigbor in adjacencyList[current]:
            if not neigbor in visitedList:
                queue.insert(0, neigbor)
        visitedList.append(current)
    return visitedList

print(BFS())

https://youtu.be/BLc3wzvycH8?si=eF15hTVnQ7IBjHP-

์œ„์˜ ๊ฐ•์˜๋ฅผ ๋ณด๊ณ  ์ž‘์„ฑํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค


๊ฐ•์˜์ž๋ถ„์ด ์ž‘์„ฑํ•œ ์ฝ”๋“œ

vertexList = ['0', '1', '2', '3', '4', '5', '6']
edgeList = [(0,1), (0,2), (1,0) , (1,3) , (2,0) , (2,4) , (2,5) , (3,1), (4,2) , (4,6), (5,2), (6,4)]
graphs = (vertexList, edgeList)

def dfs(graph, start):
    vertexList, edgeList = graph
    visitedVertex = []
    stack = [start]
    adjacencyList = [[] for vertex in vertexList]

    for edge in edgeList:
        adjacencyList[edge[0]].append(edge[1])

    while stack:
        current = stack.pop()
        for neighbor in adjacencyList[current]:
            if not neighbor in visitedVertex:
                stack.append(neighbor)
        visitedVertex.append(current)
    return visitedVertex

print(dfs(graphs, 0))
vertexList = ['A', 'B', 'C', 'D', 'E', 'F', 'G']
edgeList = [(0,1), (1,2), (1,3), (3,4), (4,5), (1,6)]
graphs = (vertexList, edgeList)

def bfs(graph, start):
    vertexList, edgeList = graph
    visitedList = []
    queue = [start]
    adjacencyList = [[] for vertex in vertexList]

    # fill adjacencyList from graph
    for edge in edgeList:
        adjacencyList[edge[0]].append(edge[1])

    # bfs
    while queue:
        current = queue.pop()
        for neighbor in adjacencyList[current]:
            if not neighbor in visitedList:
                queue.insert(0,neighbor)
        visitedList.append(current)
    return visitedList

print(bfs(graphs, 0))

 

์ด๊ฑด start ์ง€์ ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋ฅผ ๋ณผ๋• ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•ด์•ผํ• ๋“ฏ.

728x90
๋ฐ˜์‘ํ˜•