[JAVA] Programmers 단어변환

최혜원·2021년 7월 2일
0

프로그래머스

목록 보기
2/7
post-thumbnail

문제 설명
두 개의 단어 begin, target과 단어의 집합 words가 있습니다. 아래와 같은 규칙을 이용하여 begin에서 target으로 변환하는 가장 짧은 변환 과정을 찾으려고 합니다.

  1. 한 번에 한 개의 알파벳만 바꿀 수 있습니다.
  2. words에 있는 단어로만 변환할 수 있습니다.
    예를 들어 begin이 "hit", target가 "cog", words가 ["hot","dot","dog","lot","log","cog"]라면 "hit" -> "hot" -> "dot" -> "dog" -> "cog"와 같이 4단계를 거쳐 변환할 수 있습니다.

두 개의 단어 begin, target과 단어의 집합 words가 매개변수로 주어질 때, 최소 몇 단계의 과정을 거쳐 begin을 target으로 변환할 수 있는지 return 하도록 solution 함수를 작성해주세요.

제한사항!
각 단어는 알파벳 소문자로만 이루어져 있습니다.
각 단어의 길이는 3 이상 10 이하이며 모든 단어의 길이는 같습니다.
words에는 3개 이상 50개 이하의 단어가 있으며 중복되는 단어는 없습니다.
begin과 target은 같지 않습니다.
변환할 수 없는 경우에는 0를 return 합니다.

입출력 예 설명
예제 #1
문제에 나온 예와 같습니다.

예제 #2
target인 "cog"는 words 안에 없기 때문에 변환할 수 없습니다.

public class 단어변환 {
	static boolean[] visited;
	static int answer = Integer.MAX_VALUE;
	public int solution(String begin, String target, String[] words) {
        
        visited = new boolean[words.length];
        
        dfs(0,begin,target,words);
        
        // 만약 target을 찾지 못했다면 answer에 0 저장 
        if(answer==Integer.MAX_VALUE) {
        	answer = 0;
        }
        
        return answer;
    }
	
	private void dfs(int cnt, String current, String target, String[] words) {
		// target과 똑같아지면 최소 count 수를 구하고 return
		if(current.equals(target)) {
			answer = Math.min(answer, cnt);
			return;
		}
		
		for(int i=0; i<words.length; i++) {
			if(!visited[i]&&check(current,words[i])) {
				visited[i] = true;
				dfs(cnt+1,words[i],target,words);
				visited[i] = false;
			}
		}
		
	}
	
	private boolean check(String word1, String word2) {

		int diff = 0;
		for(int i=0; i<word1.length(); i++) {
			if(word1.charAt(i)!=word2.charAt(i)) {
				diff++;
			}
			// 비교하는 두 단어가 2개 이상 다를 경우 false return 
			if(diff>1) {
				return false;
			}
		}
		return true;
	}
	
	

}

이 문제는 dfs+백트래킹 문제였다! 아직 백트래킹 부분이 약한데 이 문제를 통해 다시 풀어볼 수 있어서 좋았다.
먼저, 알파벳을 한개씩만 바꿀 수 있기 때문에 check 메소드를 만들어 하나 이하의 알파벳이 다른경우 true를 return, 아닌 경우는 fasle를 return 해주었다. 그리고 words의 값 중 현재 단어가 바뀐적이 없고 알파벳이 하나 차이나는 경우 현재 단어를 words 값으로 바꿔주고 cnt값을 갱신하였다.
그리고 현재 단어가 target가 같아졌을 경우, 최소값 갱신을 해주어 답을 구하였다.

profile
멋쟁이 개발자가 될꺼야

0개의 댓글