코딩 테스트/프로그래머스

프로그래머스 - 단어 변환 문제 (자바)

programmers.co.kr/learn/courses/30/lessons/43163

 

코딩테스트 연습 - 단어 변환

두 개의 단어 begin, target과 단어의 집합 words가 있습니다. 아래와 같은 규칙을 이용하여 begin에서 target으로 변환하는 가장 짧은 변환 과정을 찾으려고 합니다. 1. 한 번에 한 개의 알파벳만 바꿀 수

programmers.co.kr

dfs 을 통해서 현재 문자와 차이가 1개 이하가 나는 것을 찾아서 이동하는 형태로 해결 

// 프로그래머스 단어변환 문제
class ChangeWord {
    static int answer = Integer.MAX_VALUE;
    public int solution(String begin, String target, String[] words) {
        // target 이 words 안에 있는지 경우
        if(isContain(target, words)) {
            boolean[] visited = new boolean[words.length];
            dfs(begin, target, words, visited, 0);
        }
        // target 이 words 안에 없는 경우
        else {
            answer = 0;
        }
        return answer;
    }


    static boolean isContain(String target, String[] words) {
        for(String word : words) {
            if(word.equals(target)) return true;
        }
        return false;
    }

    static void dfs(String temp, String target, String[] words, boolean[] visited, int count) {
        // temp 값과 타겟이 같은 경우
        if(temp.equals(target)) {
            answer = Math.min(answer, count);
            return;
        }

        for(int i = 0; i < words.length; i++) {
            int diff = 0; // temp 값과 word 의 차이 수
            for(int j = 0; j < temp.length(); j++) {
                if(temp.charAt(j) != words[i].charAt(j)) {
                    diff++;
                }
            }

            // 차이가 1개 나고 방문한적 없는 경우
            if(diff == 1 && !visited[i]) {
                visited[i] = true;
                dfs(words[i], target, words, visited, count + 1);
                visited[i] = false;
            }
        }
    }
}