from collections import deque
def solution(begin, target, words):
# target이 words에 없으면 변환할 수 없으므로 0을 반환
if target not in words:
return 0
# 큐 초기화 (변환할 단어, 변환 단계 수)
queue = deque([(begin, 0)])
# 방문 여부 체크를 위한 리스트
visited = [False] * len(words)
# 단어의 길이는 모두 같으므로 그 길이를 구해둠
word_len = len(begin)
# BFS 실행
while queue:
cur_word, cur_steps = queue.popleft()
# 현재 단어가 target과 같다면 현재 단계 반환
if cur_word == target:
return cur_steps
# words 리스트에서 한 글자만 다른 단어로 변환할 수 있는지 확인
for i in range(len(words)):
if not visited[i]:
diff_count = 0
for j in range(word_len):
if cur_word[j] != words[i][j]:
diff_count += 1 # 글자가 다른 위치를 세기
# 한 글자만 다른 경우에만 큐에 넣고 방문 처리
if diff_count == 1:
visited[i] = True
queue.append((words[i], cur_steps + 1)) # 큐에 (단어, 단계) 추가
# target까지 변환할 수 없는 경우 0 반환
return 0
keypoint
- 검사하고 싶은 것은 append로 queue에 넣어두고 검사할 때 popleft()로 빼서 확인!! => 그럼 확실히 다음 리스트의 원소로 넘어갈 때 헷갈리지 않을 것 같다.
- 이렇게 해두면 1뿌리에서 의심 되는 것을 1-2과 1-3도 queue에 추가하고 1-2와 1-3의 가지들도 확인할 수 있다..!!