https://school.programmers.co.kr/learn/courses/30/lessons/43163
begin 단어를 아래와 같은 규칙을 이용하여 target으로 바꾸는 가장 짧은 과정을 찾는 문제입니다.
변환 할 수 없는 경우 0을, 가능한 경우 가장 짧은 과정의 수를 return합니다.
DFS를 통해 해결하려고 합니다. DFS를 통해 기준이 되는 단어와 현재 탐색한 단어가 하나만 다른지 전부 체크하도록 하였습니다.
dfs함수를 선언하여 인덱스 0부터 탐색을 시작하도록 합니다. 풀이 과정은 다음과 같습니다.
재귀에서 가장 중요한 종료 조건은 begin == target일 경우로 잡았습니다. 또한 중요한 점은 탐색이 시작되기 전 true로 해놓았던 곳은 dfs가 종료되면 다시 false로 바꾸어 주어야 합니다. 그래야 다른 인덱스에 대해서도 dfs가 정상적으로 동작할 수 있습니다.
class Solution {
int answer = Integer.MAX_VALUE;
public int solution(String begin, String target, String[] words) {
boolean[] visited = new boolean[words.length];
dfs(0, 0, begin, target, words, visited);
return answer == Integer.MAX_VALUE ? 0 : answer;
}
public void dfs(int idx, int count, String begin, String target,
String[] words, boolean[] visited) {
if(begin.equals(target)) {
answer = Math.min(answer, count);
}
for(int i = 0; i < words.length; i++) {
if(visited[i] || !checkWord(begin, words[i]) || answer <= count) {
continue;
}
visited[i] = true;
dfs(i, count+1, words[i], target, words, visited);
visited[i] = false;
}
}
public boolean checkWord(String a, String b) {
int diff = 0;
for(int i = 0; i < a.length(); i++) {
if(a.charAt(i) != b.charAt(i)) diff++;
}
if (diff > 1) return false;
return true;
}
}