https://programmers.co.kr/learn/courses/30/lessons/43163
from collections import defaultdict, deque
from typing import List, Dict
def is_connected(a: str, b: str) -> bool:
# 단어를 한글자씩 비교해서, 두 단어가 한 글자만 다르면 연결한다
count = 0
for i in range(len(a)):
if a[i] != b[i]:
count += 1
return True if count == 1 else False
def solution(begin, target, words):
words.append(begin)
# key가 단어고 value는 연결된 단어 리스트인 딕셔너리를 만든다
graph: Dict[str, List[str]] = defaultdict(list)
for a in words:
for b in words:
if a == b:
continue
if is_connected(a, b):
graph[a].append(b)
# dfs로 target까지의 최단거리를 찾는다
q = deque()
q.append(begin)
# begin 기준 몇칸 떨어져있는지 기록하기 위한 딕셔너리
count: Dict[str, int] = defaultdict(int)
count[begin] = 0
while q:
now = q.popleft()
for next in graph[now]:
# 아직 방문 안했다면 큐에 넣는다
if count[next] == 0:
q.append(next)
# count를 현재 단어 기준 + 1 해서 갱신한다
count[next] = count[now] + 1
# 목적지에 도달해서 값을 갱신했다면 탐색 종료
if next == target:
return count[target]
# while문을 빠져나왔다면 target이 만들 수 없는 단어인 것
return 0