단어 변환


프로그래머스 [단어 변환]

문제보기
Alt text

소스코드

class Solution {
  private static int answer;

    public static int solution(String begin, String target, String[] words) {
        answer = 0;

        // word 안에 target이 있는지 확인
        boolean canBeTarget = false;

        for (int i = 0; i < words.length; i++) {
            if (target.equals(words[i])) {
                canBeTarget = true;
                break;
            }
        }

        if (canBeTarget) {
            boolean[] visited = new boolean[words.length];
            findTargetFromBegin(target, words, visited, begin, 0);
        }


        return answer;
    }


    private static void findTargetFromBegin(String target, String[] words, boolean[] visited, String str, int cnt) {
        if (target.equals(str)) {
            answer = answer == 0 ? cnt : Math.min(answer, cnt);
            return;
        }

        if (answer != 0 && answer < cnt) {
            return;
        }


        for (int i = 0; i < words.length; i++) {
            String word = words[i];

            if (!canUseWord(word, str) || visited[i]) continue;

            visited[i] = true;
            findTargetFromBegin(target, words, visited, word, cnt + 1);
            visited[i] = false;
        }
    }

    private static boolean canUseWord(String word, String str) {
        int diffCnt = 0;
        for (int j = 0; j < word.length(); j++) {
            if (word.charAt(j) != str.charAt(j)) {
                diffCnt++;
            }

            if (diffCnt > 1) break;
        }

        return diffCnt <= 1;
    }
}