-
[Programmers] 단어 변환[+] 알고리즘 [+] 2020. 4. 14. 19:03
[문제 설명]
두 개의 단어 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 합니다.
[풀이 과정]
본인은 어제 '2019 카카오 개발자 겨울 인턴십' 불량 사용자 문제를 풀다 실패했었다.
이 문제가 뜯어보니 DFS를 묻는 문제였다.
DFS/BFS는 언제나 어렵다. 항상 못 맞춘다. 돌이켜 보면 잘 맞춘적이 없는 것 같다.
빌어먹을 놈뭐 그래도, 자신의 약점을 발견했다는 것은 기쁜일이 아니인가?
기본 문제부터 차근차근 공부해 나가야지.
def diffone(a,b): cnt = 0 for i in range(len(a)): if a[i] != b[i]: cnt += 1 if cnt == 2: break if cnt == 1: return True return False def solution(begin, target, words): if target not in words: return 0 begin = [begin] answer = 0 while words: for string in begin: temp = [] for word in words: if diffone(string, word): temp.append(word) words.remove(word) answer += 1 if target in temp: return answer begin = temp[:] return 0
문자열이 하나만 다른지 판별하는 함수를 따로 만들어 사용했다.
확실히 가독성이 높아지고 보기 좋은 것같다.
'[+] 알고리즘 [+]' 카테고리의 다른 글
[Programmers] 행렬의 곱셈 (0) 2020.05.05 [Programmers] 구명보트 (0) 2020.04.18 [Programmers] 튜플 (0) 2020.04.10 [Programmers] 크레인 인형뽑기 게임 (0) 2020.04.10 [Programmers] 기능개발 (0) 2020.04.05