프로그래밍/Algorithm

백준 1260 DFS와 BFS

모지사바하 2021. 3. 19. 15:43

www.acmicpc.net/problem/1260

 

1260번: DFS와 BFS

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사

www.acmicpc.net

from collections import deque

N, M, V = map(int, input().split())
graph = [[] for _ in range(N+1)]
for _ in range(M):
    a, b = map(int, input().split())
    graph[a].append(b)
    graph[a].sort()
    graph[b].append(a)
    graph[b].sort()


def dfs(graph, v, visited):
    visited[v] = True
    print(v, end=' ')
    for i in graph[v]:
        if not visited[i]:
            dfs(graph, i, visited)

visited = [False] * (N+1)
dfs(graph, V, visited)
print()

def bfs(graph, start, visited):
    queue = deque([start])
    visited[start] = True
    
    while queue:
        v = queue.popleft()
        print(v, end= ' ')
        for i in graph[v]:
            if not visited[i]:
                queue.append(i)
                visited[i] = True

visited = [False] * (N+1)
bfs(graph, V, visited)


# 4 5 1
# 1 2
# 1 3
# 1 4
# 2 4
# 3 4

# 1000 1 1000
# 999 1000

# 5 5 3
# 5 4
# 5 2
# 1 2
# 3 4
# 3 1

 

이코테 책에서 보고 DFS 와 BFS 기본 탐색 구현을 해봤음에도 잠깐 당황스러웠다.

푸는데까지 그리 오래 걸리진 않았다.

책으로 볼때는 쉬워보여도 막상 직접 구현해보려고하면 좀 막히는느낌이다.

아직익숙하지 않아서겠지.

기본적으로 DFS 는 스택, BFS 는 큐를 사용하고 

재귀호출구조가 stack 에 호출을 쌓는 구조기 때문에 dfs 는 재귀호출로 구현하면 간단하다.

bfs 는 큐를 이용하면 간단히 구현할수 있는데, 파이썬에서는 deque 를 사용하면 된다.

위 구현은 인접리스트 방식으로 구현하였고 인접리스트는 graph 의 각 인덱스에 인덱스번호에 해당하는 노드(정점)와 연결된 노드번호를 저장하는것이다.

dfs 와 bfs 모두 방문처리가 중요하고 방문처리를 해줘야 재탐색하지 않는다.