반응형
📚 DFS와 BFS
문제
그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다.
입력
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.
출력
첫째 줄에 DFS를 수행한 결과를, 그 다음 줄에는 BFS를 수행한 결과를 출력한다. V부터 방문된 점을 순서대로 출력하면 된다.
예제 입력 1 복사
4 5 1
1 2
1 3
1 4
2 4
3 4
예제 출력 1 복사
1 2 4 3
1 2 3 4
예제 입력 2 복사
5 5 3
5 4
5 2
1 2
3 4
3 1
예제 출력 2 복사
3 1 2 5 4
3 1 4 2 5
예제 입력 3 복사
1000 1 1000
999 1000
예제 출력 3 복사
1000 999
1000 999
✍ 접근
- DFS BFS의 기초를 다질 수 있는 문제
정답 코드 1
import sys
from collections import deque
input = sys.stdin.readline
N,M,V = map(int,input().split())
graph = [[] for _ in range(N+1)]
for _ in range(M): ✨ 저번 코드와의 차이 1
a,b = map(int,input().split())
graph[a].append(b)
graph[b].append(a)
for i in range(N+1): ✨ 저번 코드와의 차이 2
graph[i].sort()
def DFS(v, visited = []):
visited.append(v)
print(v, end=" ")
for i in graph[v]:
if i not in visited:
DFS(i,visited)
def BFS(v):
dq = deque()
dq.append(v)
visited = []
visited.append(v)
while dq:
p = dq.popleft()
for x in graph[p]:
if x not in visited:
dq.append(x)
visited.append(x)
print(*visited)
DFS(V)
print()
BFS(V)
- 이전에 풀었을 때에 비해서 448ms => 300ms로 시간을 많이 단축시켰다
- 기존 코드는 graph를 구할 때 0으로 초기화된 2차원 배열을 만들어서 [a][b] = 1 로 초기화시켰지만
- 이번 코드는 0으로 초기화하지 않고 진행했다.
- 기존 코드는 graph를 만들었기 때문에 0~노드 개수 까지 순차적으로 도는데
- 이번 코드는 순차적으로 돌 수 없기 때문에 graph를 sort해주어야 했다
DFS
- v(시작하는 노드)를 넣고 visited=[]라는 빈 배열을 만들어준다.
- DFS함수가 시작되면 바로 현재 노드(v)를 visited 안에 넣어주고
- 현재 위치해 있는 노드의 값 == 원하는 출력 값 이기 때문에 프린트해준다
- graph[i] => 현재 노드 v에서 갈 수 있는 다른 노드들을 for문으로 돌면서
- visited에 없을 경우 DFS로 재귀를 돌아준다
BFS
- deque를 이용해 들어온 노드를 dq에 append시키고
- visited라는 빈 배열을 만들어서 방문한 노드를 기록해준다
- while dq : dq가 빈 배열이 아닐때
- popleft로 FIFO방식으로 노드를 빼주며
- 뺀 노드에서 방문할 수 있는 노드들을 for문으로 돌면서
- visited에 없을 경우 deque에 append해주고
- bfs의 while문이 끝나면 print(*visited)를 통해 배열 안의 요소를 한 칸씩 띄워서 출력해준다
⭐ 배움
- BFS와 DFS 기본을 다시 다질 수 있는 좋은 문제였다
반응형
'🏄♀️ 코딩테스트 > 🐍 Python' 카테고리의 다른 글
[ 백준 7576 ] ( python ) 토마토 (0) | 2022.06.10 |
---|---|
[ 백준 2583 ] ( python ) 영역 구하기 (0) | 2022.06.10 |
[ 백준 2156 ] ( python ) 포도주 시식 (0) | 2022.06.10 |
[ 백준 1912 ] ( python ) 연속합 (0) | 2022.06.10 |
[ 백준 1932 ] ( python ) 정수 삼각형 (0) | 2022.06.09 |