문제
그래프를 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 2 4 3
1 2 3 4
예제 입출력(2)
# 입력
5 5 3
5 4
5 2
1 2
3 4
3 1
# 출력
3 1 2 5 4
3 1 4 2 5
예제 입출력(3)
# 입력
1000 1 1000
999 1000
# 출력
1000 1 1000
999 1000
DFS와 BFS를 구현할 수 있는지 확인하는 문제이다.
코드 뜯어보기
for i in range(m):
s, e = map(int, input().split())
A[s].append(e)
A[e].append(s)
양방향 에지이므로 양쪽에 에지를 더해줬다.
for i in range(n + 1):
A[i].sort()
방문할 수 있는 노드가 여러 개일 경우 작은 것 부터 방문해야 하므로 먼저 오름차순 정렬한다.
def DFS(now):
print(now, end=' ')
visited[now] = True
for i in A[now]:
if not visited[i]:
DFS(i)
- visited 리스트에 현재 노드의 방문 여부를 기록하고
- 현재 노드의 연결 노드 중 방문하지 않은 노드로 DFS를 실행한다.(재귀)
def BFS(now):
que = deque()
que.append(now)
visited[now] = True
while que:
now_node = que.popleft()
print(now_node, end=' ')
for i in A[now_node]:
if not visited[i]:
que.append(i)
visited[i] = True
- 큐 자료구조에 시작 노드를 넣어 준다.
- 현재 큐가 빌 때까지 다음 로직을 수행한다.
- 큐에서 노드 데이터를 가져와서 출력
- 현재 노드의 연결 노드 중 방문하지 않은 노드를 큐에 삽입
- 방문 여부 기록
정답 코드
from collections import deque
n, m, v = map(int, input().split()) # n: 노드 개수, m: 에지 개수, v: 시작점
A = [[] for _ in range(n + 1)] # 그래프 데이터 저장 리스트
for i in range(m):
s, e = map(int, input().split())
A[s].append(e)
A[e].append(s)
for i in range(n + 1):
A[i].sort()
def DFS(now):
print(now, end=' ')
visited[now] = True
for i in A[now]:
if not visited[i]:
DFS(i)
visited = [False] * (n + 1)
DFS(v)
def BFS(now):
que = deque()
que.append(now)
visited[now] = True
while que:
now_node = que.popleft()
print(now_node, end=' ')
for i in A[now_node]:
if not visited[i]:
que.append(i)
visited[i] = True
print()
visited = [False] * (n + 1)
BFS(v)
'알고리즘' 카테고리의 다른 글
[삽입 정렬] 백준 - 11399번: ATM (파이썬) (0) | 2024.06.07 |
---|---|
[버블 정렬] 백준 - 1377번: 버블 소트 (파이썬) (0) | 2024.06.06 |
[브루트 포스] 백준 - 1018번: 체스판 다시 칠하기 (파이썬) (0) | 2024.06.03 |
[문자열/구현] 백준 - 28432번: 끝말잇기 (파이썬) (0) | 2024.06.01 |
[리스트/딕셔너리] 백준 - 7785번: 회사에 있는 사람 (파이썬) (0) | 2024.05.30 |