알고리즘
[프로그래머스] 단어변환 (파이썬)
유병각
2022. 2. 3. 21:47
문제링크
https://programmers.co.kr/learn/courses/30/lessons/43163
코딩테스트 연습 - 단어 변환
두 개의 단어 begin, target과 단어의 집합 words가 있습니다. 아래와 같은 규칙을 이용하여 begin에서 target으로 변환하는 가장 짧은 변환 과정을 찾으려고 합니다. 1. 한 번에 한 개의 알파벳만 바꿀 수
programmers.co.kr
문제풀이
이 문제는 begin 이라는 문자열을 몇 번 변환해서 target 이라는 문자열로 만들 수 있는지 묻는 문제이다.
이 문제에 핵심 아이디어는 BFS 를 사용해서 푸는것이다.
먼저 words 문자열 안에 target 이라는 문자열이 존재하지 않으면 0 을 리턴하는 예외처리를 해준다.
그 다음, 처음 주어진 단어를 1번 변환해서 얻을 수 있는 단어들을 [word, 1] 형태의 리스트로 queue 에 집어넣는다. ( bfs 식 접근 )
그리고 리스트에 들어간 단어들은 방문처리를 해준다.
다음으로 단어를 2번 변환해서 얻을 수 있는 단어들은 현재 queue 에 들어있는 단어들을 토대로 알 수 있다.
이런식으로 변환을 k 번 할때, 변환된 단어중에서 target 과 같은 단어가 있으면, count 를 리턴해주면 된다.
visited 처리와 isOneCharDiff 함수만 잘 작성해주면 풀 수 있는 문제이다.
소스코드
from collections import deque;
def solution(begin, target, words):
ans = 0;
if (target not in words):
return ans;
#Make visited
visited = {};
for w in words :
visited[w] = 0;
return BFS(begin, words, visited, target)
#SET
def isOneCharDiff(a,b):
cnt = 0;
for i in range(len(a)):
if a[i] != b[i]:
cnt += 1;
if cnt == 1:
return True;
else:
return False;
#BFS
def BFS(begin,words,visited,target):
queue = deque();
queue.append([begin, 0]);
while(queue):
[nowWord, cnt] = queue.popleft();
# while 문 종료조건
if (nowWord == target):
return cnt;
# 로직
for w in words:
if (visited[w] == 0 and isOneCharDiff(nowWord, w)):
visited[w] = 1;
queue.append([w, cnt + 1]);
return 0;