PS/프로그래머스

단어 변환 (lv3)

ForteQook 2022. 7. 28. 16:02

문제 설명

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

 제한 조건에 의해 단어가 변환될 때는 알파벳 한개만 바뀌므로, 그것을 기준으로 그래프를 그리는게 핵심인 문제이다. 문제는 단순히 "몇 단계" 를 거치는지만 묻고 있으므로, 그동안 풀었던 BFS 최단거리 문제와 동일하게 접근 가능하다. 따라서 단어의 인접 노드를 찾아주는 메서드를 만들고, 중복되는 단어는 존재하지 않으니 딕셔너리에 거리 정보를 계속 갱신시켜주면 된다.

코드

from collections import deque

length = 0

def get_adj(now, words):
    adjList = []
    for word in list(words):
        cnt = 0
        for i in range(length):
            if now[i] != word[i]:
                cnt += 1
            if cnt > 1:
                break
        else:
            adjList.append(word)
            words.remove(word)
    return (adjList,words)
    
def solution(begin, target, words):
    global length
    length = len(begin)
    words = set(words)
    distances = {word:0 for word in words}
    distances[begin] = 0
    q = deque()
    q.append(begin)
    while q:
        now = q.popleft()
        if now == target:
            return distances[target]
        adjList,words = get_adj(now,words)
        for adj in adjList:
            if distances[adj] == 0:
                distances[adj] = distances[now] + 1
                q.append(adj)
    return 0

 

'PS > 프로그래머스' 카테고리의 다른 글

다리를 지나는 트럭 (lv2)  (0) 2022.07.29
카펫 (lv2)  (0) 2022.07.28
구명 보트 (lv2)  (0) 2022.07.28
큰 수 만들기 (lv2)  (0) 2022.07.28
무지의 먹방 라이브 (lv4)  (0) 2022.07.27