Algorithms/- 프로그래머스

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

자굿 2022. 2. 8. 23:19
 

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

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

programmers.co.kr

 

정답(Solution)

 

1. 재귀를 사용한 풀이

import java.util.*;

class Solution {

    private List<Integer> iList = new ArrayList<>();

    public int solution(String begin, String target, String[] words) {

        boolean f = false;

        for(String str : words){
            if(target.equals(str)){
                f = true;
                break;
            }
        }

        if(f){
            boolean[] v = new boolean[words.length];
            dfs(begin, target, words, v, 0);
        }else{
            return 0;
        }

        int[] a =iList.stream().sorted().limit(1).mapToInt(Integer::intValue).toArray();
        return a[0];
    }

    private void dfs(String begin, String target, String[] words, boolean[] v, int sum){
        if(begin.equals(target)){
            iList.add(sum);
            return;
        }

        for(int i=0; i<words.length; i++){
            if(!v[i] && check(begin, words[i])){
                v[i] = true;
                dfs(words[i], target, words, v, sum + 1);
                v[i] = false;
            }
        }

    }

    private boolean check(String begin, String word){
        char[] a = begin.toCharArray();
        char[] b = word.toCharArray();

        int cnt = 0;
        for(int i=0; i<a.length; i++){
            if(a[i] != b[i]){
                cnt++;
            }
        }

        return cnt == 1 ? true : false;
    }
}

 

분석

  • dfs문제이다.
  • 변환시킬 수 있는 단어인지 체크하는 함수와 방문 여부를 체크하는 배열 v만 잘 정리해주면 된다.

 

2. Stack을 사용한 풀이

import java.util.*;

class Solution {
    
    public int solution(String begin, String target, String[] words) {
        int answer = 0;
        
        Arrays.sort(words);
        int num = Arrays.binarySearch(words, target);
        int len = words.length;
        
        if(num >= 0){
            
            Stack<String> stk = new Stack<>();
            stk.push(begin);
            boolean[] v = new boolean[len];
            
            while(!stk.isEmpty()){
                String str = stk.pop();
                
                for(int i=0; i<len; i++){
                    if(v[i]) continue;
                    if(target.equals(str)) return answer;
                    if(check(words[i], str)){
                        v[i] = true;
                        stk.push(words[i]);
                        answer++;
                        break;
                    }
                }
            }
            
            return answer;
        }else{
            return 0;
        }
    }
    
    private boolean check(String str1, String str2){
        
        int count = 0;
        
        for(int i=0; i<str1.length(); i++){
            if(str1.charAt(i) != str2.charAt(i)){
                count++;
            }
        }
        
        return count == 1 ? true : false;
    }
}

 

분석

  • Stack을 활용하여 dfs방식으로 풀이하였다.
  • 1개의 char만 다른지 확인하는 check 함수를 만들어서 변환 가능한지 체크하였다.
반응형