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

Narcoker·2022년 9월 7일
0

코딩테스트

목록 보기
23/150

문제 설명

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

입출력 예

풀이

bfs를 활용하여 문제를 풀었다.
words 배열에 target 값이 없으면 바로 0을 반환한다.
처음에 queue에 초기값을 넣고 그 값을 빼옴으로써 bfs를 시작한다.
words 배열에서 방문하지 않은 배열이고 글자 차이가 1 인경우
queue에 넣는다. 이 과정을 반복하다가 words 배열 값이 target인 경우
현재 방문횟수(value[1])+1 값을 return 해준다.
만약 queue에 값이 없다면 bfs를 종료하고 0을 리턴한다.
방문 시 visited 배열의 해당 단어의 인덱스 value를 true로 처리한다.

function solution(begin, target, words) {
    if (words.indexOf(target) === -1)
        return 0;
    let visited = new Array(words.length).fill(false);
    let queue = [[begin, 0]];
    let value;
    while (queue.length > 0) {
        value = queue.shift();
        for (let i = 0; i < words.length; i++) {
            if (visited[i] === false) {
                let diff = 0;
                let index = words.indexOf(words[i]);
                for (let k = 0; k < words[0].length; k++) {
                    if (value[0][k] !== words[i][k])
                        diff++;
                }
                if (diff === 1 && visited[index] === false) {
                    if (words[i] === target) return value[1] + 1;
                    queue.push([words[i], value[1] + 1]);
                    visited[index] = true;
                };
            }
        }
    }
    return 0;
}

회고

bfs 사용시 depth 값은 반드시 필요하다는 사실을 잊지말 것.

profile
열정, 끈기, 집념의 Frontend Developer

0개의 댓글