Study(진행중)/항해99

99클럽 코테 스터디 33일차 TIL / 단어 변환(프로그래머스)

Ski_ 2024. 8. 24. 02:37

오늘의 학습 키워드

   - 알고리즘

   - 구현

   - DFS

공부한 내용 본인의 언어로 정리하기

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

문자열들이 주어졌을 때 처음 문자열에서 한 글자 씩 변경하여 제공된 다른 문자열로 바꾸고,

이 과정을 목표 문자열까지 반복하는 문제이다. 

 

풀이 과정은 다음과 같다.

1. 모든 문자열들을 문자 배열(char[])로 변경한다

2. 문자들에 대해 비교하며 dfs 과정을 진행한다

 

 

풀이는 다음과 같다.

import java.util.*;

class Solution {
    
    String[] words;
    char[][] wordChar;
    boolean[] visit;
    
    int answer = 51, wordCnt;
    String begin, target;
    
    public int solution(String begin, String target, String[] words) {
        
        this.begin = begin;
        this.target = target;
        
        wordCnt = words.length;
        visit = new boolean[wordCnt + 1];
        this.words = new String[wordCnt + 1];
        
        for (int i = 0; i < wordCnt; i++) {
            this.words[i] = words[i];
        }
        this.words[wordCnt] = begin;
        
        wordChar = new char[wordCnt + 1][];
        
        for (int i = 0; i < wordCnt; i++) {
            String word = words[i];
            wordChar[i] = word.toCharArray();
        }
        wordChar[wordCnt] = begin.toCharArray();
        
        visit[wordCnt] = true;
        
        dfs(0, wordCnt);
        
        return answer == 51 ? 0 : answer;
    }
    
    public void dfs(int depth, int curIdx) {
        
        String cur = words[curIdx];
        
        if (cur.equals(target)) {
            answer = Math.min(depth, answer);
            return;
        }
        
        if (depth == wordCnt) return;
        
        char[] str1 = wordChar[curIdx];
        
        for (int i = 0; i <= wordCnt; i++) {
            
            if (visit[i]) continue;
            int cnt = 0;
            char[] str2 = wordChar[i];
            
            for (int s = 0; s < str1.length; s++) {
                if (str1[s] != str2[s]) cnt++;
            }
            
            if (cnt != 1) continue;
            
            visit[i] = true;
            dfs(depth + 1, i);
            visit[i] = false;
        }
    }
}
반응형