본문 바로가기

알고리즘/백준 문제 풀이

[Python] 14496번 그대, 그머가 되어

728x90

https://www.acmicpc.net/problem/14496

 

14496번: 그대, 그머가 되어

첫째 줄에 머호가 바꾸려 하는 문자 a와 b가 주어진다. 둘째 줄에 전체 문자의 수 N과 치환 가능한 문자쌍의 수 M이 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ M ≤ 10,000) 이후 M개의 줄에 걸쳐 치환 가능한 문

www.acmicpc.net


 

22/10/08

 

 

단순 BFS문제이다.


 

문제 접근 방식:

 

 

이 문제에서 요구하는 바는 a를 b로 바꾸기 위해 필요한 최소 치환 횟수이다.

 

결국 어느 정점에서 다른 한 정점으로 가는 최소 거리를 구하는 문제와 별 다를 바가 없으므로, BFS로 해결할 수 있다.

 

구현하는데 주의할 점은 행렬과 같이 주어진 그래프와는 다르게 실제 간선으로 그래프가 주어져서, 그 부분만 조금 고치면 쉽게 구현할 수 있다.

 

또한, 바꿀 수 없을 때 -1을 출력한다는 점만 주의하면 된다.


아래는 내가 위의 접근 방식과 같이 작성한 파이썬 코드이다. 더보기를 누르면 확인할 수 있다.

더보기
# 14496번 그대, 그머가 되어
# 그래프 이론, 그래프 탐색, BFS
'''
접근 방법:
어느 한 정점에서 다른 정점으로 가는 최소 거리를 구하는 문제이므로
BFS로 풀 수 있다.
'''
from collections import deque
import sys
input = sys.stdin.readline

start, end = map(int, input().rstrip().split())
total_node_num, total_edge_num = map(int, input().rstrip().split())

graph = [[] for _ in range(total_node_num + 1)]
visited = [0 for _ in range(total_node_num + 1)]
for _ in range(total_edge_num):
    node1, node2 = map(int, input().rstrip().split())
    graph[node1].append(node2)
    graph[node2].append(node1)

queue = deque()
queue.append((start, 0))
visited[start] = 1
flag = True
while queue:
    now_node, time = queue.popleft()
    if now_node == end:
        print(time)
        flag = False
        break
    for node in graph[now_node]:
        if visited[node] == 0:
            visited[node] = 1
            queue.append((node, time+1))
if flag:
    print(-1)