https://programmers.co.kr/learn/courses/30/lessons/43163

 

코딩테스트 연습 - 단어 변환

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

programmers.co.kr

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
def solution(begin, target, words):
    answer = 0
    visit = [0]*len(words)#방문한 곳 표시
    queue = [] #방문한 단어를 넣음
    
    #target이 words배열 안에 없으면 return 0
    if target not in words:
        return answer
    
    #두 문자열에서 다른 문자의 차이를 return
    def get_diff(A, B):
        cnt=0
        for a, b in zip(A, B):
            if a!=b:
                cnt+=1
        return cnt
        
    def bfs(begin, target):
        nonlocal queue, visit, answer
        queue.append(begin) #먼저 begin을 넣음
           #큐가 빌때까지 돎.
        while queue:
            x = queue.pop(0#queue의 맨 앞의 것을 pop
            len_x = len(x)#단어의 길이를 계산
            if get_diff(x, target) ==1#pop한 단어와 target의 단어 차이가 1이면
                answer+=1 #answer에 +1을해주고
                break #while문 종료
            
            for i in range(len(visit)): #0부터 끝까지 돌면서 탐색
                if visit[i] == 0 and get_diff(x, words[i]) == 1#방문하지 않았고, 차이가 1이면
                    queue.append(words[i]) #큐에 넣음
                    visit[i]=1 # 방문 표시
                    answer+=1 #변환 과정이므로 +1
                    break
    bfs(begin, target)
    return answer
cs

 

효율적이지 않은 코드일 수도 있지만, 오랜만에 레퍼런스 안보고 혼자서 푼 문제다 :)

로직 짜는 게 수월해질 수 있을때까지 열심히 공부하기!!

 

 

(혹시 코드에 오류가 있다면 댓글로 알려주세요.)