두 개의 단어 begin, target과 단어의 집합 words가 있습니다. 아래와 같은 규칙을 이용하여 begin에서 target으로 변환하는 가장 짧은 변환 과정을 찾으려고 합니다.
- 한 번에 한 개의 알파벳만 바꿀 수 있습니다.
- 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 값은 반드시 필요하다는 사실을 잊지말 것.