출처 : https://swexpertacademy.com/main/learn/course/lectureProblemViewer.do

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

1. 문제 설명

V개의 노드 개수와 방향성이 없는 E개의 간선 정보가 주어진다.

주어진 출발 노드에서 최소 몇 개의 간선을 지나면 도착 노드에 갈 수 있는지 알아내는 프로그램을 만드시오.

예를 들어 다음과 같은 그래프에서 1에서 6으로 가는 경우, 두 개의 간선을 지나면 되므로 2를 출력한다.


   



 
노드 번호는 1번부터 존재하며, 노드 중에는 간선으로 연결되지 않은 경우도 있을 수 있다.

[입력]

첫 줄에 테스트 케이스 개수 T가 주어진다.  1<=T<=50

다음 줄부터 테스트 케이스의 첫 줄에 V와 E가 주어진다. 5<=V=50, 4<=E<=1000

테스트케이스의 둘째 줄부터 E개의 줄에 걸쳐, 간선의 양쪽 노드 번호가 주어진다.

E개의 줄 이후에는 출발 노드 S와 도착 노드 G가 주어진다.

[출력]

각 줄마다 "#T" (T는 테스트 케이스 번호)를 출력한 뒤, 답을 출력한다.

두 노드 S와 G가 서로 연결되어 있지 않다면, 0을 출력한다.

 

2. 코드

큐를 이용하여 풀 수 있는 문제였습니다. 재귀를 이용하여 bfs를 몇번 실행해야 출발 노드에서 도착 노드까지 갈 수 있을 지 코드를 작성하였습니다. 간선이 양방향이기 때문에 2차원 배열을 만들어 활용하였습니다.

 

아래가 작성한 코드입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# bfs를 실행할 함수
def bfs(q, cnt, end):
    global result
    next_q = []
    # 현재 큐에 원소가 없을 때까지 진행
    while len(q):
        node = q.pop(0)
        # 끝점에 도달한 경우 종료
        if node == end:
            result = cnt
            return
        # 현재 노드에서 방문을 안한 노드 중 갈 수 있는 노드를 다음 큐에 추가
        for n in range(1, V+1):
            if visited[n] == 0 and pos[node][n] == 1:
                visited[n] = 1
                next_q.append(n)
    # 다음에 실행할 큐에 원소가 없을 경우 종료
    if len(next_q) == 0:
        return
    # 원소가 있으면 bfs 다시 실행
    else:
        bfs(next_q, cnt+1, end)
 
= int(input())
for tc in range(1, T+1):
    V, E = map(int, input().split())
    # 간선 정보를 저장할 이차원 배열
    pos = [[0 for _ in range(V+1)] for _ in range(V+1)]
    for _ in range(E):
        x, y = map(int, input().split())
        pos[y][x] = 1
        pos[x][y] = 1
    start_n, end_n = map(int, input().split())
    # 노드 방문 기록을 저장할 배열
    visited = [0]*(V+1)
    result = 0
    # 초기값 정보 정리
    q = [start_n]
    visited[start_n] = 1
    bfs(q, 0, end_n)
    print('#{} {}'.format(tc, result))

+ Recent posts