coding/알고리즘,자료구조
BFS 연습 - 단어변환(프로그래머스)
Jeo
2022. 2. 10. 11:23
문제: https://programmers.co.kr/learn/courses/30/lessons/43163
✔︎ 더 알아봐야 할 점
- DFS에서의 백트래킹하듯이 BFS 에서도 적당히 가지치기 하면 좋겠다 싶다.
- 그런데 이를 위해서는 모든 큐의 원소에서 기억하고 가지고 다녀야 할 정보? 메모리?에 부담이 늘어나는 것이 아닐까?
- 더 좋은 방법으로 BFS에서 가지치는 방법은 어떤 것이 있을까?
import collections
def solution(begin, target, words):
n = len(begin)
que = collections.deque()
que.append((begin, 0))
while que:
word, cnt = que.popleft()
# 타겟 발견하면 cnt 로 탐색한 레벨을 리턴
if word == target:
return cnt
# 탐색을 허락할 수 있는 최대 레벨(깊이/cnt)는 words 에 포함된 친구들 개수이므로
# 여기까지 왔는데도 답을 못 찾았다면,
# 소모적인 탐색 그만두게 하기
if cnt >= len(words):
break
# 후보 단어들 중에 다른 글자수가 1이라면 변환 가능한 단어이므로,
# 변환 횟수인 cnt 를 +=1 하여 다음의 가능성 있는 변환을 위해 큐에 넣어 줌.
for candidate in words:
diff = 0
for i in range(n):
if word[i] != candidate[i]:
diff += 1
if diff == 1:
que.append((candidate, cnt+1))
# 답을 찾지 못하고 while 종료시 0 리턴
return 0