[DFS/BFS] 단어 변환

yejichoi·2023년 7월 24일
0

알고리즘 스터디

목록 보기
77/153
post-thumbnail

단어 변환

두 개의 단어 begin, target과 단어의 집합 words가 있습니다. 아래와 같은 규칙을 이용하여 begin에서 target으로 변환하는 가장 짧은 변환 과정을 찾으려고 합니다.

1. 한 번에 한 개의 알파벳만 바꿀 수 있습니다.
2. words에 있는 단어로만 변환할 수 있습니다.

예를 들어 begin이 "hit", target가 "cog", words가 ["hot","dot","dog","lot","log","cog"]라면 "hit" -> "hot" -> "dot" -> "dog" -> "cog"와 같이 4단계를 거쳐 변환할 수 있습니다.
두 개의 단어 begin, target과 단어의 집합 words가 매개변수로 주어질 때, 최소 몇 단계의 과정을 거쳐 begin을 target으로 변환할 수 있는지 return 하도록 solution 함수를 작성해주세요.

제한사항

  • 각 단어는 알파벳 소문자로만 이루어져 있습니다.
  • 각 단어의 길이는 3 이상 10 이하이며 모든 단어의 길이는 같습니다.
  • words에는 3개 이상 50개 이하의 단어가 있으며 중복되는 단어는 없습니다.
  • begin과 target은 같지 않습니다.
  • 변환할 수 없는 경우에는 0를 return 합니다.

입출력 예

begintargetwordsreturn
hitcog["hot", "dot", "dog", "lot", "log", "cog"]4
hitcog["hot", "dot", "dog", "lot", "log"]0

🌺 풀이

# bfs 
from collections import deque
def solution(begin, target, words):
    if target not in words:
        return 0
#     visited =[0]*len(words)

    q = deque() # 큐 선언
    q.append((begin,0)) # 큐에 시작값 넣어주기 
#     cnt = 0
    while q:
        visited = [0]*len(words) # 방문했는지 확인용
        b,idx = q.popleft() # 큐에서 하나씩 뽑아서 확인 
        if b == target:
            break
        for i in range(len(words)):
            for j in range(len(words[i])):
                print("알파벳비교",i,j, b[j], words[i][j])
                if b[j] == words[i][j]: # 알파벳 비교 
                    visited[i] +=1 
                    # 단어를 비교하여 알파벳이 얼마나 똑같은게 있는지 
            
        for i in range(len(visited)):
            
            if visited[i] == (len(target)-1):
                q.append((words[i],idx+1))
                words[i] = str(idx) # 중복해서 큐에 들어가는 것을 방지
                print("words[i]", words[i], idx)

    
    return idx

0개의 댓글