다음은 연결되어 있는 두 개의 정점 사이의 간선을 순서대로 나열 해 놓은 것이다. 모든 정점을 깊이 우선 탐색하여 화면에 너비우선 탐색 경로를 출력하시오. 시작 정점을 1로 시작하시오.
입력
입력 파일의 첫 번째 줄에는 테스트 케이스 T(1 <= T <= 10)의 개수가 주어지며, 각 테스트 케이스의 첫 줄에는 정점의 개수 N, 간선의 개수 M(1 <= N. M <= 10000)가 주어진다. 그 다음 M줄에 거쳐 인접한 두 정점이 주어진다.
입력 예시
1
7 8
1 2
1 3
2 4
2 5
4 6
5 6
6 7
3 7
출력
모든 정점을 너비 우선 탐색하여 경로를 출력하시오. 시작 정점은 1로 한다.
출력 예시
1 2 3 4 5 7 6
🍟 나의 풀이
from collections import deque
def bfs(v):
queue = deque() # 큐 생성
# 시작 정점 1을 추가
queue.append(1)
visited[1]=1
while queue:
v = queue.popleft()
print(v) # 삭제 후 출력
for i in lst[v]: # 정점의 값(인접한 정점) 탐색
if visited[i] != 1: # 방문한 적 없으면
queue.append(i) # 정점 추가
visited[i] = 1 # 방문 처리
T = int(input()) # 테스트 케이스 수
for tc in range(T):
N, M = map(int, input().split()) # 정점의 개수, 간선의 개수
visited = [0] * (N + 1) # 정점을 1부터 시작하려고 +1만큼 만듦
lst = [[] for _ in range(N + 1)] # 인덱스 : 정점, 값 : 인접한 정점 값
for i in range(M): # 인접한 두 정점 정보가 주어짐
x, y = map(int, input().split())
# 양방향으로 연결함
lst[x].append(y)
lst[y].append(x)
bfs(1) # bfs함수 호출
1. 시작 정점 1을 queue에 삽입, visited에 방문 처리한다.
2. queue에서 가장 맨 앞에 있는 값을 pop하고 출력한다.
3. 정점 v의 값(인접한 정점)을 for 반복문을 통해 탐색한다.
4. 정점 i를 방문한적 없다면 queue에 추가하고 visited[i]=1
2 ~ 4 과정을 queue에 값이 있을 동안 반복.
문제 출처 SW expert academy
반응형
'coding test' 카테고리의 다른 글
[파이썬] 1233. 사칙연산 유효성 검사 (0) | 2021.03.17 |
---|---|
[파이썬] 1231. 중위순회 (0) | 2021.03.16 |
[파이썬] 1226. 미로1 (0) | 2021.03.12 |
[파이썬] 괄호 짝 판별 (0) | 2021.03.09 |
[Python] 같은 번호 짝 소거하기 (0) | 2021.03.09 |