[BaekJoon 1260 : DFS/BFS, Python] - DFS와 BFS

2021, Oct 18    


백준 1260 DFS와 BFS : 실버 2



Solution

# DFS - 재귀호출 사용
import sys
from collections import defaultdict, deque
input = sys.stdin.readline
sys.setrecursionlimit(100000)

p, l, v = [int(x) for x in input().split()]
graph = defaultdict(list)

for _ in range(l):
    x, y = list(map(int, input().split()))    # 간선 양방향으로 연결
    graph[x].append(y)
    graph[y].append(x)

for key in list(graph.keys()):        # 한 정점에 연결된 여러 개의 정점을 오름차순으로 정렬
    graph[key].sort()

def recur_DFS(v, visited):
    visited.append(v)
    if v not in graph:        # 시작점에 간선이 연결되어 있지 않은 경우
        return visited
    for w in graph[v]:            
        if w not in visited:
            visited = recur_DFS(w, visited)
    
    return visited
  
print(*recur_DFS(v, visited=[]))


# BFS - 반복문과 deque 사용

dq = deque()

def BFS(v, visited):
    dq.append(v)
    visited.append(v)
    while dq:
        cur = dq.popleft()
        if cur not in graph:    # 시작점에 간선이 연결되어 있지 않은 경우
            return visited
        for w in graph[cur]:
            if w not in visited:
                visited.append(w)
                dq.append(w)

    return visited
    
print(*BFS(v, visited=[]))


풀이과정 및 느낀점


사용된 알고리즘 자체는 전형적인 dfs/bfs 였지만, 양방향 그래프였고, 연결된 정점이 여러 개이면 정점 번호가 작은 순서대로 방문해야해서 그 부분을 좀 더 신경써야 했다.