문제 설명
두 개의 단어 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 함수를 작성해주세요.
begin | target | words | return |
---|---|---|---|
hit | cog | [hot, dot, dog, lot, log, cog] | 4 |
hit | cog | [hot, dot, dog, lot, log] | 0 |
예제 #1문제에 나온 예와 같습니다.
예제 #2target인 cog는 words 안에 없기 때문에 변환할 수 없습니다.
한 글자만 다른 단어
= 연결되어있는 노드
라고 생각해 BFS를 사용했다.target
과 동일한 단어가 나오면 해당 레벨, 깊이를 출력한다.직접 그려본 조잡한 그림..
def solution(begin, target, words):
answer = 0
queue = [begin]
while True:
tmp_q = []
for word_1 in queue:
if word_1 == target:
return answer
for word_2_idx in range(len(words)-1, -1, -1):
word_2 = words[word_2_idx]
difference = sum([x != y for x, y in zip(word_1, word_2)])
if difference == 1:
tmp_q.append(words.pop(word_2_idx))
if not tmp_q:
return 0
queue = tmp_q
answer += 1
tmp_q
라는 리스트로 한꺼번에 묶는다는 아이디어도 생각하지 못했다.for word_2_idx in range(len(words)-1, -1, -1):
이와 같은 방식으로 range를 사용하면, index오류 없이 pop()
사용이 가능하다는 것을 꺠달았다. (멍청)