본문 바로가기
STUDY/자료구조 및 알고리즘

DFS

by devohda 2021. 7. 17.

python으로 알고리즘을 다시 공부하기 시작했다.

 

- 처음 만든 DFS 코드

# DFS - 깊이 우선 탐색
def make_dict(node):
    return {'node': node}


def make_graph(node, edge):
    graph = [[] for _ in range(node)]  # 연결 리스트 만들기
    for _ in range(edge):
        n, m = map(int, input().split())
        # 작은 순서대로 sorting 해야 되는데ㅠㅠ
        graph[n-1].append(make_dict(m))
        graph[m-1].append(make_dict(n))
    return graph


def DFS(graph, stack, flag):
    while len(stack) != 0:
        top = stack[-1]
        if len(graph[top - 1]) == 0:
            stack.pop()
        else:
            n = graph[top - 1][0]["node"]
            if flag[n-1] == 0:
                flag[n-1] = 1
                stack.append(n)
                print(n)
            else:
                graph[top - 1].pop(0)


N, E = map(int, input().split())
G = make_graph(N, E)
F = [0] * N
S = []

start_point = int(input())
F[start_point-1] = 1  # 방문 완료 처리
S.append(start_point)
print(start_point)

DFS(G, S, F)

 

- 2차로 다듬은 코드

괜히 메모리 한 줄 줄이겠다고 n - 1과 같이 알아보기 힘들고 계산도 어려운 코드는 지양하도록 하자.

8개가 필요하면 9개를 할당 받아서 1~9까지 사용하는 방식으로 바꿨다.

# DFS - 깊이 우선 탐색
# 스택을 이용한 DFS 구현

def make_dict(node):
    return {'node': node}


def make_graph(node, edge):
    graph = [[] for _ in range(node + 1)]  # 연결 리스트 만들기
    for _ in range(edge):
        n, m = map(int, input().split())
        # 작은 순서대로 sorting 해야 되는데ㅠㅠ
        graph[n].append(make_dict(m))
        graph[m].append(make_dict(n))
    return graph


def DFS(graph, stack, visited):
    while len(stack) != 0:
        top = stack[-1]
        if len(graph[top]) == 0:
            stack.pop()
        else:
            n = graph[top][0]["node"]
            if not visited[n]:
                visited[n] = True
                stack.append(n)
                print(n)
            else:
                # 효율을 따져서 다시 만들자..
                graph[top].pop(0)


N, E = map(int, input().split())  # N : 노드 개수, E : 간선 개수
G = make_graph(N, E)  # 그래프 만들기
V = [False] * (N + 1)  # 방문 처리
S = []

start_point = int(input())
V[start_point] = 1  # 방문 완료 처리
S.append(start_point)
print(start_point)

DFS(G, S, V)

 

아직 멀었다. 혼자 DFS를 생각하는 데에 1시간 반은 걸렸다.

다른 사람들 코드랑 비교해서 다듬어야지ㅠㅠ

'STUDY > 자료구조 및 알고리즘' 카테고리의 다른 글

[BOJ 1260] DFS 와 BFS  (0) 2021.07.18
BFS  (0) 2021.07.17

댓글