[Silver II] DFS와 BFS - 1260
https://www.acmicpc.net/problem/1260
문제설명
그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다.
입력
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.
출력
첫째 줄에 DFS를 수행한 결과를, 그 다음 줄에는 BFS를 수행한 결과를 출력한다. V부터 방문된 점을 순서대로 출력하면 된다.
예제입력 / 예제출력
문제이해 및 코드설명
가장 기본적인 DFS, BFS문제이다.
코드를 설명하기 앞서 DFS와 BFS에 대해 기본적인 이해가 필요하다.
DFS (Depth-First Search)는 깊이우선탐색으로 그래프에서깊은 부분을 우선적으로 탐색하는 알고리즘으로 스택자료구조 or 재귀함수를 이용한다는 특징이 있다.
BFS (Breadth-First Search) 는 너비우선탐색으로 그래프에서 가까운 노드부터 우선적으로 탐색하는 알고리즘으로 큐 자료구조를 이용한다는 특징이 있다.
코드에 대해서 이야기해보자면, 처음 그래프를 만든 뒤 간선은 양방향이기때문에 graph에 a자리에 b를 b자리에도 a값을 추가시켜준 후 정점번호가 작은것부터 먼저방문처리하기위해 정렬을 시켜주었다.
DFS는 초기 방문하지않음으로 해준 후 현재노드는 방문처리 후 현재노드와 연결된 다른 노드를 재귀적으로 방문하도록 하였다.
BFS도 마찬가지로 초기엔 방문처리되지않음으로 표시한 후, 현재노드를 방문처리하였다. 이후 큐를 활용하여 먼저 list에 추가된 순서대로 방문처리를 할 수 있도록 코드를 작성하였다.
문제를 풀면서 느낀점은 이 문제가 DFS와 BFS의 가장 기본적인 코드이기 때문에 확실히 이해하고 외우는것이 중요하다고 생각했다.
코드
from collections import deque
n, m, v = map(int, input().split())
graph = [[] for _ in range(n + 1)]
for i in range(m):
a, b = map(int, input().split())
graph[a].append(b)
graph[b].append(a)
graph[a].sort()
graph[b].sort()
visited = [False] * (n + 1)
def Dfs(graph, v, visited):
visited[v] = True
print(v, end=' ')
for i in graph[v]:
if not visited[i]:
Dfs(graph, i, visited)
def Bfs(graph, v, visited):
visited = [False] * (n + 1)
queue = deque([v])
visited[v] = True
while queue:
pop = queue.popleft()
print(pop, end=' ')
for i in graph[pop]:
if not visited[i]:
queue.append(i)
visited[i] = True
Dfs(graph, v, visited)
print()
Bfs(graph, v, visited)
'알고리즘 문제풀이' 카테고리의 다른 글
백준 - 아기상어2 17086(Python) (0) | 2023.03.01 |
---|---|
백준 - 지름길 1446 (Python) (0) | 2023.03.01 |
백준 - 단어 정렬 1181(Python) (0) | 2023.03.01 |
백준 - 접미사 배열 11656 (Python) (0) | 2023.02.28 |
백준 - 돌려 돌려 돌림판! 11504 (Python) (0) | 2023.02.28 |