해당 문제도 BFS 로 접근할 수 있겠지만 구현에 초점을 두었을 때 DFS
를 통한 깊이우선탐색
이 직관적이라 DFS 로 접근하였다
풀이에 앞서 미리 메모해가며 어떻게 풀 수 있는지 특이사항에 대해 기록하고 시작한다
이렇게 정의를 내리고 아래에는 대략적인 flow 를 기록한다
static String[] words;
static int minVal = Integer.MAX_VALUE;
public static List<Integer> getPossibleWord(String word, boolean[] visited){
// 현재 word 에서 한개의 문자만 바뀌었을 때에 바뀔 수 있는 유망한 단어의 인덱스를 반환한다
// 모든 단어의 길이는 같다
List<Integer> pos = new ArrayList<>();
for (int i = 0; i < words.length; i++) {
int cnt = 0;
if(!visited[i]){
// 해당 단어로 바뀐 적이 없다면
for (int j = 0; j < word.length(); j++) {
if(cnt > 1) break; // 두개이상의 문자가 차이나면 break
if(words[i].charAt(j) != word.charAt(j)) cnt++; // 문자가 다를때마다 +1
}
if(cnt==1) pos.add(i); // 만약 바뀔 수 있다면 pos 에 담아준다
}
}
return pos;
}
public static void dfs(String begin, String target, boolean[] visited, int cnt, int visitCnt){
// 시작점이 현재 타겟과 같다면 현재 최대값과 비교 후 return;
if(begin.equals(target)){
minVal = Math.min(cnt, minVal);
return;
}
if(visitCnt == visited.length) return;
// 아니라면 유망한 경우를 찾는다
List<Integer> pos = getPossibleWord(begin,visited);
for (Integer p : pos) {
visited[p] = true; // 해당 유망한 경우를 선택한 경우
dfs(words[p], target, visited, cnt+1, visitCnt+1);
}
}
public static void main(String[] args) {
words = new String[]{"hot", "dot", "dog", "lot", "log"};
boolean[] visited = new boolean[words.length];
dfs("hit", "cog", visited, 0,0);
if(minVal==Integer.MAX_VALUE) System.out.println(0);
else System.out.println(minVal);
}
import java.util.*;
class Solution {
static String[] words;
static int minVal = Integer.MAX_VALUE;
public static List<Integer> getPossibleWord(String word, boolean[] visited){
// 현재 word 에서 한개의 문자만 바뀌었을 때에 바뀔 수 있는 유망한 단어의 인덱스를 반환한다
// 모든 단어의 길이는 같다
List<Integer> pos = new ArrayList<>();
for (int i = 0; i < words.length; i++) {
int cnt = 0;
if(!visited[i]){
// 해당 단어로 바뀐 적이 없다면
for (int j = 0; j < word.length(); j++) {
if(cnt > 1) break; // 두개이상의 문자가 차이나면 break
if(words[i].charAt(j) != word.charAt(j)) cnt++; // 문자가 다를때마다 +1
}
if(cnt==1) pos.add(i); // 만약 바뀔 수 있다면 pos 에 담아준다
}
}
return pos;
}
public static void dfs(String begin, String target, boolean[] visited, int cnt, int visitCnt){
// 시작점이 현재 타겟과 같다면 현재 최대값과 비교 후 return;
if(begin.equals(target)){
minVal = Math.min(cnt, minVal);
return;
}
if(visitCnt == visited.length) return;
// 아니라면 유망한 경우를 찾는다
List<Integer> pos = getPossibleWord(begin,visited);
for (Integer p : pos) {
visited[p] = true; // 해당 유망한 경우를 선택한 경우
dfs(words[p], target, visited, cnt+1, visitCnt+1);
// visited[p] = false; // 백트래킹, 해당 유망한 경우를 선택하지 않은 경우
}
}
public int solution(String begin, String target, String[] words1) {
words = words1;
boolean[] visited = new boolean[words.length];
dfs(begin, target, visited, 0, 0);
if(minVal == Integer.MAX_VALUE) return 0;
return minVal;
}
}