프로그래머스

프로그래머스_단어변환

집못가는프로그래머 2021. 9. 10. 03:42

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

 

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

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

programmers.co.kr

이 문제는 DFS, BFS 두 알고리즘이 가장 먼저 떠올랐지만 최단거리가 문제의 주요 핵심인 만큼 Dijkstra(다익스트라)를 써야겠다고 생각 들었다. 물론 DFS, BFS로 구현이 불가능한 것은 아니지만 다익스트라 구현이 더 끌렸다..ㅎ

 Code

import numpy as np

def solution(begin, target, words):

    words[1:] = words
    words[0] = begin
    relation = list(np.zeros(len(words)**2).reshape(-1,len(words)))

    for i in range(len(words)) :
        for j in range(i+1, len(words)) :
            cnt = 0
            for k in range(len(begin)) :
                if words[i][k] != words[j][k] :
                    cnt += 1
            if cnt <= 1 :
                relation[i][j] = 1
                relation[j][i] = 1
    
    check = [False for _ in range(len(words)+1)]
    steps = [99 for _ in range(len(words))]

    def bfs(index, step) :
        check[index] = True
        steps[index] = step
        for i in range(len(words)) :
            if relation[index][i] == 1 and steps[i] > step :
                bfs(i, step + 1)

    bfs(0, 0)

    try :
        target = words.index(target)
    except ValueError :
        target = 0 
    finally :
        return steps[target] if target != 0 else 0

 

 Code 설명

- 기본적으로 Dijkstra로 구현한 만큼 변할 수 있는 단어 끼리의 간선의 가중치를 1로 지정하고 시작한다.

- 시작 노드는 begin 노드이므로 begin을 0번쨰 노드로 지정한다

- 0번째 노드를 시작으로 최단거리 알고리즘(Dijkstra)를 진행한다

- 만약 현 단어에서 변할수 있는 단어인데 더 짧은 거리로 도달했다면 거리의 값을 갱신한다.

- 모든 과정이 끝난 후 target노드의 값에는 최단거리가 저장되있을 것이다.

- try문을 사용한 이유는 만약 target이 words 리스트에 없을 경우를 위함이다.(없을 경우 변할 수 없으므로 0)

- finally문에 삼항연산자를 이용한 이유는 target의 값이 0인경우 0을 출력해야 하기 때문이다.