[문제풀이]프로그래머스-단어변환

seongwonchung·2020년 12월 31일
0

문제설명

두 개의 단어 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 합니다.

해설

words의 각 단어들을 그래프의 노드로 생각하면, 바꿀 수 있는 형태의 단어들과 연결되어있다고 생각할 수 있다. 따라서, 한 개의 알파벳만 다른 경우, 단어 노드 간에 연결되어 있는 그래프로 생각할 수 있다.

따라서, begin에서 target단어로 연결 되는 그래프에서 그래프 탐색을 통해 몇개의 edge를 거쳐 target word에 도착하는지 계산하면 변환 과정을 찾을 수 있다. 나는 DFS를 사용하여 풀이했다.

words의 단어 node는 연결된 node가 여러개 있을 수 있으므로 변환 과정이 여러 개일 수 있다. 따라서, 모든 변환 과정을 찾아서 최솟값을 구해야 한다. 그러므로 특정 단어 node에서 words에 있는 모든 node와 의 연결 여부와 방문 여부를 고려하여 반복한다. 방문 여부의 경우, 현재 변환과정에서 거쳐온 노드로 다시 돌아가지 않도록 방문 여부를 기록해야한다.


코드

def solution(begin,target,words):
    answer = 0
    visited = [0]*len(words)
    stages = []
    
    def isLinked(word1, word2):
        cnt = 0
        for i in range(len(word1)):
            if word1[i] != word2[i]:
                cnt+=1
        if cnt == 1: 
            return True
        return False

    def dfs(word, depth):
        # target word일 경우, 멈추고 depth를 기록
        if word == target:
            stages.append(depth)
            return
        else:
            for i in range(len(words)):
                if isLinked(word, words[i]) and visited[i] == 0:
                    visited[i] = 1 
                    dfs(words[i], depth+1)
                    visited[i] = 0 # 특정 노드에서 가능한 모든 변환과정 기록 후에는 방문처리 해제

    dfs(begin, 0)

    if stages:
        answer = min(stages)
    return answer

isLinked함수 에서 단어 노드 간에 연결 되어있는지 판단한다.
dfs 함수는 word가 target일 경우 depth를 기록하고, return한다. 재귀함수 형태로 구현하였으며, 방문처리의 경우 dfs이후에 다시 0으로 처리하여 다른 경로로는 다시 방문할 수 있게 처리했다.


p.s.

이번 풀이에서는 DFS를 사용했는데, 가장 끝 노드인 target까지의 최단 거리를 찾아야하므로 DFS가 적절하다고 생각했다. 하지만 다른 풀이들을 참고했을 때 BFS로도 풀이가 가능한 것 같다. BFS로 다시 한 번 풀어봐야 할 것 같다.


🧐 DFS/BFS 정리

문제 풀이에 사용된 DFS/BFS알고리즘에 대한 내용은 따로 정리해둔 포스트에서 볼 수 있습니다.

DFS/BFS

profile
일과 생각에 대한 기록

0개의 댓글