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

lee-goeun·2023년 5월 20일
0

문제출처
https://school.programmers.co.kr/learn/courses/30/lessons/43163

문제 설명

두 개의 단어 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. 시작 단어를 방문변수에 넣어주고 값을 0으로 처리한다.
  2. 큐 변수를 만들어 변화가 가능한 값들을 넣어준다.
  3. 큐에 값이 있다면 값을 하나씩 빼어 타겟과 일치한지 확인한다. 일치한다면 멈춘다.
  4. 일치하지 않다면 words를 돌면서 한 글자만 다른 지 이 값이 방문하지 않는 값인지 확인하여 방문하지 않는 값이라면 현재 키의 값에서 1만큼 더한 값을 넣어준다. 그리고 그 단어를 큐에 넣어준다.
  5. 연결되어 있는 지 확인하기 위한 함수는 두 단어를 인자값으로 받아 비교할 단어의 길이값만큼 돌려 각 단어가 같지 않으면 1씩 더하여 길이값이 1인 값만 true로 반환한다.

이 문제 역시 BFS라는 것은 알았지만 여전히 어떻게 풀어야 하는 지 모르겠는 상황이었다. 다른 사람의 코드를 참고하였고 코드를 보고 문제풀이 과정을 확인하였다.

코드

function solution(begin, target, words) {
    const visited = {[begin] : 0};
    const queue = [begin];
    while(queue.length){
        const cur = queue.shift();
        if(cur == target) break;
        
        for(const word of words){
            if(isConnected(word, cur) && !visited[word]){
                visited[word] = visited[cur] + 1;
                queue.push(word);
            }
        }
    }
    
    return visited[target] ? visited[target] : 0;
}

const isConnected = (str1, str2) => {
    let count = 0;
    const len = str1.length;
    for(let i=0; i<len; i++){
        if(str1[i] !== str2[i]) count++;
    }
    return count == 1 ? true : false;
}

0개의 댓글