Coding Test/프로그래머스

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

lsh2613 2023. 8. 8. 23:03

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 풀이

1. bfs, dfs를 구현할 줄 아는가

2. 각 단계별로 몇 번 진행됐는지 카운팅 할 수 있는가

3. 단어가 변환될 수 있는지 체크할 수 있는

위 3조건만 가능하다면 나름 쉽게 구현이 가능하다

 

탐색 연습겸 bfs, dfs 둘 다 구현해보았다.

 

코드 - BFS

import java.util.*;
class Solution {
    static boolean[] vs;

    public int solution(String begin, String target, String[] words) {
        int answer = 0;
        answer = bfs(begin, target, words);
        return answer==-1? 0 : answer;
    }
    
    static int bfs(String begin, String target, String[] words){
        int len = words.length;
        vs= new boolean[len];
        
        Queue<String> q = new LinkedList<>();
        q.offer(begin);
        
        int cnt=0;
        while(!q.isEmpty()){
            for(int j=0;j<q.size();j++){
                String now = q.poll();
                
                if(now.equals(target))
                    return cnt;
                
                for(int i=0;i<len;i++){
                    if(vs[i]||!canChange(now, words[i])) continue;
                    
                    vs[i]=true;
                    q.offer(words[i]);
                }
            }
            cnt++;
        }
        return -1;
        
    }
    
    static boolean canChange(String s1, String s2){
        int cnt=0;
        for(int i=0;i<s1.length();i++){
            if(s1.charAt(i)==s2.charAt(i))
                cnt++;
        }
        return cnt==s1.length()-1?true:false;
    }
}

 

코드 - DFS

import java.util.*;
class Solution {
    static boolean[] vs;
    static String[] words;
    static int answer;
    
    public int solution(String begin, String target, String[] words) {
        this.words=words;
        vs = new boolean[words.length];
        
        dfs(begin, target, 0);
        return answer;
    }

    static void dfs(String now, String target, int cnt){
        if(now.equals(target)){
            answer=cnt;
            return;
        }

        for(int i=0; i<words.length; i++){
            if(vs[i]||!canChange(now, words[i])) continue;

            vs[i]=true;
            dfs(words[i], target, cnt+1);
            vs[i]=false;
        }
    }

    static boolean canChange(String s1, String s2){
        int cnt=0;
        for(int i=0;i<s1.length();i++){
            if(s1.charAt(i)==s2.charAt(i))
                cnt++;
        }
        return cnt==s1.length()-1?true:false;
    }

}