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

Updated:

문제 URL

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

풀이

  • 두 개의 단어 begin에서 target까지 최소 단계를 구하는 bfs문제다.

  • 문제를 다 풀고 다른 풀이를 보았는데 dfs라고 푼것을 보았으나 사실상 브루트 포스로 푸는 것을 볼 수 있었다. 수강했던 백준강의에 따르면 dfs, bfs는 한번 방문했던 노드를 또 다시 방문하지 않아야한다!

  • bfs로 각 단계마다(1,2,3,4….) 도달할 수 있는 모든 word를 queue에 넣는다. 따라서 한번 나왔던 단어는 다시 방문하지 않아도된다.(나중 단계에서 나오면 답이 될수 없기 때문이다 왜냐면 최소단계를 구하는 문제이기때문에!!)

나의 풀이 (배열)

import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;


class Solution {
     public int solution(String begin, String target, String[] words) {
       //중복방문하지 않기위한 set
        HashSet<String> dupSet = new HashSet<>();

        //word 저장
        Queue<String> q = new LinkedList<>();
        //word의 단계저장
        Queue<Integer> nq = new LinkedList<>();
        //초기값 설정
        q.add(begin);
        nq.add(0);

        //bfs
        while(!q.isEmpty()){
            String str = q.remove();
            int n = nq.remove();

            for(String word : words){
                //중복검사
                if(dupSet.contains(word) || (!cal(word,str)))
                    continue;
                if(word.equals(target))
                    return (n+1);

                q.add(word);
                nq.add(n+1);
                dupSet.add(word);
            }
        }
        return 0;
    }

//한문자 빼고 맞는지 검사 맞으면 true
    public boolean cal(String word1, String word2){
        if(word1.length() != word2.length())
            return false;

        int n=0;
        for(int i=0; i<word1.length(); i++){
            if(word1.charAt(i) == word2.charAt(i))
                n++;
        }
        if(n==word1.length()-1)
            return true;
        return false;
    }
}

Leave a comment