πŸ’»Tech/β˜•Java

[Java] ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ 단어 λ³€ν™˜

_viper_ 2023. 10. 4. 17:48
λ°˜μ‘ν˜•

πŸ“„ 문제

단어 λ³€ν™˜

 

πŸ’‘ ν’€μ΄

BFS(λ„ˆλΉ„ μš°μ„  탐색) μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜μ—¬ "begin" λ¬Έμžμ—΄μ—μ„œ "target" λ¬Έμžμ—΄λ‘œ λ³€ν™˜ν•˜λŠ”λ° ν•„μš”ν•œ μ΅œμ†Œ 단계 수λ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€.

 

import java.util.*;

class Solution {
    public int solution(String begin, String target, String[] words) {
        int answer = 0; // μ΅œμ†Œ 단계 수λ₯Ό μ €μž₯ν•  λ³€μˆ˜
        boolean[] visited = new boolean[words.length]; // 단어 λ°©λ¬Έ μ—¬λΆ€λ₯Ό μΆ”μ ν•˜λŠ” λ°°μ—΄
        Queue<String> queue = new LinkedList<>(); // BFS 탐색을 μœ„ν•œ 큐

        queue.offer(begin); // μ‹œμž‘ 단어λ₯Ό 큐에 μΆ”κ°€

        while (!queue.isEmpty()) { // 큐가 λΉ„μ–΄μžˆμ§€ μ•Šμ€ λ™μ•ˆ 반볡
            int size = queue.size(); // ν˜„μž¬ 레벨의 큐 크기λ₯Ό μ €μž₯

            for (int i = 0; i < size; i++) {
                String current = queue.poll(); // νμ—μ„œ ν˜„μž¬ 단어 μΆ”μΆœ

                if (current.equals(target)) { // ν˜„μž¬ 단어가 λͺ©ν‘œ 단어인 경우
                    return answer; // μ΅œμ†Œ 단계 수 λ°˜ν™˜
                }

                for (int j = 0; j < words.length; j++) {
                    if (!visited[j] && canTransform(current, words[j])) {
                        // 단어 λ°©λ¬Έ μ—¬λΆ€ 확인 및 λ³€ν™˜ κ°€λŠ₯ν•œ 경우
                        visited[j] = true; // 단어λ₯Ό 방문으둜 ν‘œμ‹œ
                        queue.offer(words[j]); // 큐에 μΆ”κ°€
                    }
                }
            }

            answer++; // ν˜„μž¬ 레벨의 λͺ¨λ“  단어λ₯Ό μ²˜λ¦¬ν•˜κ³  단계 증가
        }

        return 0; // λ³€ν™˜ν•  수 μ—†λŠ” 경우
    }

    private boolean canTransform(String from, String to) {
        int diffCount = 0; // 문자 차이λ₯Ό λ‚˜νƒ€λ‚Ό λ³€μˆ˜ μ΄ˆκΈ°ν™”

        for (int i = 0; i < from.length(); i++) {
            if (from.charAt(i) != to.charAt(i)) {
                diffCount++; // λ‹€λ₯Έ λ¬Έμžκ°€ 발견될 λ•Œλ§ˆλ‹€ 증가
            }

            if (diffCount > 1) {
                return false; // 문자 차이가 1을 μ΄ˆκ³Όν•˜λ©΄ λ³€ν™˜ λΆˆκ°€λŠ₯
            }
        }

        return diffCount == 1; // 문자 차이가 1이면 λ³€ν™˜ κ°€λŠ₯, κ·Έ μ™Έμ—” λΆˆκ°€λŠ₯
    }
}