출처: 프로그래머스 코딩테스트 깊이,너비 우선 탐색(DFS/BFS) 3번째 문제
(https://programmers.co.kr/learn/courses/30/lessons/43163)
두 개의 단어 begin, target과 단어의 집합 words가 있습니다. 아래와 같은 규칙을 이용하여 begin에서 target으로 변환하는 가장 짧은 변환 과정을 찾으려고 합니다.
예를 들어 begin이 "hit", target가 "cog", words가 ["hot","dot","dog","lot","log","cog"]라면 "hit" -> "hot" -> "dot" -> "dog" -> "cog"와 같이 4단계를 거쳐 변환할 수 있습니다.
두 개의 단어 begin, target과 단어의 집합 words가 매개변수로 주어질 때, 최소 몇 단계의 과정을 거쳐 begin을 target으로 변환할 수 있는지 return 하도록 solution 함수를 작성해주세요.
import java.util.*;
class Solution {
private int answerCnt = 0;
private boolean isFound = false;
private String target = null;
public int solution(String begin, String target, String[] words) {
List<String> visited = new ArrayList<String>();
this.target = target;
List<String> newWords = Arrays.asList(words);
search(begin,newWords,visited,1);
return answerCnt;
}
private void search(String str, List<String> words, List<String> visited, int cnt) {
if ( isFound ) return;
visited.add(str);
List<String> convertableWords = getConvertableWords(str,words,visited);
if ( convertableWords.size() < 1 ) return;
if ( convertableWords.contains(target) ) {
answerCnt = cnt;
isFound = true;
return;
}
for ( String word : convertableWords ) {
search(word,words,new ArrayList<>(visited),cnt+1);
}
}
private List<String> getConvertableWords(String str,List<String> words,List<String> visited) {
List<String> convertableWords = new ArrayList<String>();
for ( String word : words ) {
if ( visited.contains(word) ) continue;
if ( !isConvertable(str,word) ) continue;
convertableWords.add(word);
}
return convertableWords;
}
private boolean isConvertable(String str, String target) {
char[] strChars = str.toCharArray();
char[] targetChars = target.toCharArray();
int cnt = 0;
for ( int i = 0; i < strChars.length; i++ ) {
if ( strChars[i] == targetChars[i] ) {
cnt++;
}
}
return cnt == strChars.length - 1 ? true : false;
}
}
그동안 탐색문제들을 어렵게 느꼇었는데 이제는 어느정도 수준의 문제는 풀 수 있을 것같은 자신감을 얻었다.