DFS/BFS - 단어 변환 (Level 3)

jisu_log·2025년 3월 25일

알고리즘 문제풀이

목록 보기
10/105

words 리스트 내의 각 단어까지 가는 데 걸린 거리(단계)를 누적해서 저장할 words_dist 리스트를 추가로 생성하여 BFS로 구현

from collections import deque

def bfs(begin, target, words):
    words_dist = [0] * len(words) # 해당 인덱스에 위치한 단어까지 가는데 걸린 단계를 저장할 리스트
    q = deque()
    q.append((begin, 0))
    is_finish = False
    target_idx = -1
    
    while q:
        word, idx = q.popleft()
        # word와 알파벳 하나 차이나는 단어와 그 인덱스를 모두 찾기
        for i in range(0, len(words)):
            if words_dist[i] != 0: # 이미 방문한 단어라면 패스
                continue
            
            diff_cnt = 0 # 차이나는 알파벳 개수 누적할 변수
            
            for j in range(0, len(word)): # 현재 단어 word와 words[i]의 알파벳 차이 체크
                if word[j] != words[i][j]: # 알파벳이 다름
                    diff_cnt += 1
                if diff_cnt >= 2: # 2개 이상 차이나면 더 볼 필요없음
                    break
                    
            if diff_cnt == 1: # i번째 단어가 방문 가능한 단어라면 (차이 = 1)
                if words[i] == target: # target 단어를 찾았다면 반복문 종료
                    is_finish = True 
                    target_idx = i
                    
                words_dist[i] = words_dist[idx] + 1 # 현재 방문한 거리 누적
                q.append((words[i], i)) # 다음에 방문하도록 큐에 저장
            
            if is_finish: 
                break
        if is_finish:
            break
    
    if target_idx == -1: # target 단어를 찾지 못했다면
        return 0
    
    return words_dist[target_idx] # target 단어까지 가는 데 누적된 거리 반환
            
        
def solution(begin, target, words):
    
    answer = bfs(begin, target, words)
    return answer

0개의 댓글