function solution(begin, target, words) {
if(!words.includes(target)) return 0;
let answer = 0;
let usedWords = new Set();
let toConvert = [begin];
let converted = [];
while(true){
toConvert.forEach(e => usedWords.add(e));
answer++;
for(let i = 0; i < toConvert.length; i++) {
for(let j = 0; j < toConvert[i].length; j++) {
let spliceWord = toSplice(toConvert[i],j)
let match = words.filter(e => !usedWords.has(e) && toSplice(e,j) == spliceWord);
converted.push(...match)
}
if(converted.includes(target)) return answer;
}
toConvert = converted;
converted = [];
}
}
function toSplice(word,index) {
let temp = word.split('');
temp.splice(index,1);
return temp.join('');
}
접근방법
변환 해야할 단어들을 toConvert 배열에 넣는다. 가장 처음에는 begin 단어가 들어가게 된다.
toConvert 배열의 단어들을 모두 검사하여 다음 단어로 올 수 있는 모든 단어를 converted 배열에 넣는다.
converted 배열의 요소들을 toConvert 배열로 옮겨주고 converted 배열은 다시 0으로 만들어 위 과정을 반복한다.
이때 toConvert의 요소들은 이미 사용된 단어들이고 변환대상이 될 수 없으므로 set에 저장하여 필터링을 위해 사용한다.
while(true)반복문의 초기에 먼저 answer++해주고, converted 배열에 원하는 정답이 있다면 answer을 리턴한다.