개발/알고리즘

[알고리즘] 3. DFS&BFS(나동빈 2021 이코테)

윤J 2023. 4. 8. 17:31

https://www.youtube.com/watch?v=7C9RgOcvkvo&t=2871s 

- 탐색: 많은 양의 데이터 중 원하는 데이터를 찾는 과정

 

- 스택: 먼저 들어온 데이터가 나중에 나가는 형식(선입후출) 입구=출구

           -> python은 append(넣기) pop(빼기)

stack = []
stack.append(5) #index 0
stack.append(2)
stack.append(3)
stack.append(7)

stack.pop() #원소 7 삭제

print(stack) #[5,2,3]

- : 먼저 들어온 데이터가 먼저 나가는 형식(선입선출) 줄서는거!

       -> python은 deque 라이브러리 불러오기/ append와 popleft

from collections import deque

queue = deque() #queue 구현을 위해 deque 라이브러리 사용

queue.append(5)
queue.append(2)
queue.append(3)
queue.append(7)
queue.popleft() #가장 왼쪽 원소(5) 삭제

print(queue) #[2,3,7]

- 유클리드 호제법(최대공약수 계산)

자연수 A, B

A / B = 몫 ... R 일 때, A,B 최대공약수 = B,R 최대공약수

def gcd(a, b):
    if a%b == 0:
        return b
    else:
        return gcd(b, a%b) #b랑 a%b(나머지)를 나눈 게 0이 될 때까지 재귀~

print(gcd(192, 162))

 

- DFS: 깊이 우선 탐색(깊은 부분 우선적으로 탐색) STACK 이용

def dfs(graph, v, visited):

    visited[v] = True #현재 노드를 방문 처리
    
    print(v, end=' ')

    for i in graph[v]: #graph[v]는 v 지점과 인접한 노드들 [2,3,8]
        if not visited[i]: #지점 i가 방문되지 않았다면
            dfs(graph, i, visited)

graph = [
    [],
    [2,3,8],
    [1,7],
    [1,4,5],
    [3,5],
    [3,4],
    [7],
    [2,6,8],
    [1,7],
    ]

visited = [False] * 9

dfs(graph, 1, visited)

 

- BFS: 너비 우선 탐색(가까운 노드 우선적으로 탐색하는 알고리즘) QUEUE 이용 => 최단 경로

       -> 처음 노드 큐에 넣고, 꺼내고 인접한 노드 한번에 큐에 넣기 -> 순서대로 하나 꺼내고 인접한 노드 한번에 큐에 넣기 -> 반복 

from collections import deque

def bfs(graph, start, visited):

    queue = deque([start])
    visited[start] = True

    while queue: #queue에 아무것도 없을 때까지 반복
        v = queue.popleft() #방문처리한 노드 빼기
        print(v, end=' ')

        for i in graph[v]:
            if not visited[i]:
                queue.append(i)
                visited[i] = True


graph = [
    [],
    [2,3,8],
    [1,7],
    [1,4,5],
    [3,5],
    [3,4],
    [7],
    [2,6,8],
    [1,7],
    ]

visited = [False] * 9

bfs(graph, 1, visited)