문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/43163
문제 풀이
- begin 에 담긴 단어를 알파벳 하나씩 바꿔가며 target에 담긴 단어로 변환하는 과정
- 규칙은 words 리스트에 담긴 단어들로만 변환 할 수 있음.
- 딕셔너리를 이용해서 풀 수도 있겠지만 그냥 인덱스로 계산해서 코드를 짬
- begin이 변할 수 있는 것들도 찾기 위해 일단 words에 담음
- words에 담긴 각각의 단어들에 대해 자신이 변할 수 있는 모든 경로를 찾아서 그래프에 담음
- 이후 begin(0번째 인덱스)을 큐에 담아서 BFS 탐색을 진행
- next가 end(words에 담긴 target읜 인덱스) 와 같다면 cnt+1 을 리턴 해줌
- while문이 끝났는데도 리턴 값이 없다면 존재하지 않는 경우이므로 0
소스 코드
from collections import deque
def solution(begin, target, words):
if(target not in words):
return 0
words=[begin]+words #begin으로부터 변환 할 수 있는 것들을 찾기 위해 words에 넣어줌
end = words.index(target)
n = len(words)
k=len(begin)
visited=[False]*n
gr = [[]for i in range(n)]
for i in range(n): #각각의 단어들로부터 변환 할 수 있는 쌍들을 찾는 과정
cur = words[i]
for j in range(i+1,n):
next = words[j]
dif = 0
for z in range(k):
if cur[z]!=next[z]:
dif+=1
if dif>=2:
break
if dif==1:
gr[i].append(j)
gr[j].append(i)
q=deque()
q.append((0,0))
visited[0]=True
while(q): //BFS
cur,cnt = q.popleft()
for next in gr[cur]:
if visited[next]==True:
continue
if next==end:
return cnt+1
visited[next]=True
q.appendleft((next,cnt+1))
return 0
print(solution("hit","cog",["hot", "dot", "dog", "lot", "log", "cog"]))
'코딩 테스트 > 프로그래머스' 카테고리의 다른 글
[그리디] 단속 카메라 (0) | 2023.04.03 |
---|---|
[동적 계획법] 등굣길 (0) | 2023.03.31 |
[DFS/BFS] 네트워크 (0) | 2023.03.30 |
[연습 문제] 최고의 집합 (0) | 2023.03.29 |
[힙] 이중 우선순위 큐 (0) | 2023.03.29 |