관리 메뉴

JIE0025

[DFS][lv.3] 단어 변환 - 자바(Java) 본문

알고리즘/프로그래머스

[DFS][lv.3] 단어 변환 - 자바(Java)

Kangjieun11 2023. 8. 4. 15:29
728x90

 

 

 

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/43163?language=java 

 

프로그래머스

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

programmers.co.kr

 

 


문제

 

두 개의 단어 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 합니다.

 

 

✅ 풀이 과정

0.  자료구조 / 알고리즘 선택

DFS, BFS를 이용해서 풀 수 있다.

 

이전에 BFS(파이썬)로 풀었던 기억이 나서 , 이번에는 자바로 DFS로 풀어보았다. 

 

https://jie0025.tistory.com/486

 

[BFS][lv.3] 단어 변환 - 파이썬(Python)

https://school.programmers.co.kr/learn/courses/30/lessons/43163 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는

jie0025.tistory.com

 

 

1. 복잡도 

모든 단어의 길이가 10 이하이고, 총 단어의 개수는 50개가 최대이므로

현재 단어(1개)와 모든 단어를 비교한다고 하더라도 500밖에 안된다. 

 

최악의 경우 1개 단어에서 시작해서 -> 49번의 변경 이후 target을 찾게 될 텐데

그렇게 되더라도 약 500 * 50 = 25000...정도 나오지 않을까 예상해본다.

 

 

2. 수도코드/ 알고리즘 생각

 

1) DFS를 실천한다. 단어의 변환이 생길 때마다 개수를 세어주기 위해 count 매개변수를 따로 선언한다.

 

2) 만약 begin (DFS하면서 계속 변경 되는 단어 변수) 이 target과 같아지게 되면 answer에 count(몇번 변환되었는가?)를 할당하고 종료한다. 

 

3) 단어 하나하나를 현재단어(Begin)과 비교한다. 

begin의 길이만큼 반복문을 돌려서 begin과 word(모든단어중 현재 비교중인 단어)가 알파벳 한글자만 다른지 확인한다. 

한글자만 다른 경우 방문처리를 해주고, DFS를 호출한다.  호출 이후에는 방문처리를 취소해준다.

 

 

 

✅ 내가 쓴 정답코드

import java.util.*;

class Solution {
    
    static int answer; 
    static boolean[] visit;

    
    public int solution(String begin, String target, String[] words) {
        
        visit = new boolean[words.length];
        
        dfs(begin, target, words, 0);
        
        return answer;
    }
    
    public void dfs(String begin, String target, String[] words, int count) {
        
        if (begin.equals(target)) {
            answer = count;
            return;
        }
        
        //단어를 하나하나 체크한다. 
        //아직 visit처리가 안됐고, 알파벳 한개만 다를 때 (변경 가능) 변경해준다.
        for (int i = 0; i< words.length; i++) {
            
            if (visit[i] == true) 
                continue;
            
            String word = words[i];
            int notEqual = 0;
            
            for (int c = 0; c<begin.length(); c++) {
                if (begin.charAt(c) != word.charAt(c)) {
                    notEqual += 1;
                }      
            }
            
            //만약 1개만 다르면 변경 가능한 것
            if (notEqual == 1) {
                visit[i] = true;
                dfs(word, target, words, count+1);
                visit[i] = false;
            }
        }
    }
}

 

 

 

 

 

 

 





references

더보기

프로그래머스