알고리즘 공부/문제 풀이

[프로그래머스] DFS/BFS - 단어 변환

valid_ming 2020. 8. 25. 23:11

단어를 만들 수 있는 가장 적은 변환 횟수를 리턴하는 문제라

너비 우선 탐색을 이용하겠다고 생각하였다.

 

탐색 구현까지는 어쩨 저쩨 했는데

최소 횟수를 어떻게 구하나 막막하던 쯤

Node를 만들기로 하였고 Node 클래스를 만들어 문제를 해결하였다.

 

package algorithmStudy;

import java.util.*;

class Node{
	String val;
	int level;
	public Node(String v,int l) {
		val=v;
		level=l;
	}
}

public class dfsbfs {
	static boolean check(String a,String b) {
		int num=0;
		for(int i=0;i<a.length();i++) {
			if(a.charAt(i)!=b.charAt(i)) num++;
		}
		return num==1?true:false;
	}
	
	static int solution(String begin, String target, String[] words) {
        int answer = 0;
        
        Queue<Node> q = new LinkedList<>();
        boolean[] visited=new boolean[words.length];
        for(int i=0;i<words.length;i++) {
        	visited[i]=false;
        	if(begin.equals(words[i])) 
        		return 0;
        }
        
        q.add(new Node(begin,0));
        
        while(!q.isEmpty()) {
        	Node cur=q.poll();
        	if(target.equals(cur.val)) return cur.level;
        	for(int i=0;i<words.length;i++) {
        		//방문하지 않았고 1개의 문자만 다르다면
        		if(!visited[i] && check(cur.val,words[i])) {
        			visited[i]=true;
        			q.add(new Node(words[i],cur.level+1));
        		}
        	}
        }
        return answer;
    }
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String begin="hit";
		String target="cog";
		String[] words= {"hot", "dot", "dog", "lot", "log", "cog"};
		
		System.out.println(solution(begin,target,words));
	}

}