function solution(begin, target, words) {
//다음으로 바꿀수 있는 단어가 들어간 큐
const que = [begin];
//방문여부 판별 배열
const isVisited = words.map(w => false);
//target으로 바꾸는 것이 가능한지 판별 flag
let flag = false;
//target으로 바꾸는 것이 가능할 때 변환과정 answer;
let answer = 0;
//isChangeable이라는 함수로 현재 단어와 큐에 집어넣을 그 다음 단어가 changeable한지 판별한다.
//changeable한 조건은 단어의 알파벳 중 한자리만 다른 알파벳인 경우 변경 가능
const isChangeable = (begin, target) => {
const result = begin.split('').reduce((acc, char, i)=> {
return char === target[i]? acc + 1 : acc;
},0)
return result === begin.length - 1? true : false;
;}
//que가 비어있을 때까지 작업
while(que.length) {
//큐의 맨 앞 단어를 빼줌
const current = que.shift();
//만약 단어가 target과 같으면 flag = true, 반복문을 빠져나감
if(current === target) {
flag = true;
break;
}
//위에서 que.shift하고 que가 비었을 경우 다음 레벨에서 changeable한 단어들을 구해서
//큐에 다시 넣어줌
if(que.length === 0) {
//다음 레벨로 넘어간 것이므로 answer 1 증가
answer++;
const next = words.reduce((arr, word, i) => {
//단어 목록 중 아직 한번도 que에 넣지 않았고 현재 단어와 changeable한 경우
if(!isVisited[i] && isChangeable(current, word)) {
arr.push(word);
//큐에 넣으면 어차피 순차적으로 shift되기 때문에 이때 방문여부 true
isVisited[i] = true;
}
return arr;
},[]);
//큐에 넣어줌
que.push(...next);
}
}
//flag가 false인 경우 못찾았다는 뜻이므로 0 반환 true이면 찾았다는 뜻이므로 answer반환
return flag? answer : 0;
}
'Algorithm > 문제풀이' 카테고리의 다른 글
Programmers - 크레인 인형뽑기 게임 / Javascript (0) | 2021.02.14 |
---|---|
Programmers - 124 나라의 숫자 / Javascript (0) | 2021.02.14 |
Programmers - 카펫 / Javascript (0) | 2021.01.11 |
Programmers - 모의고사 / Javascript (0) | 2021.01.11 |
Programmers - 이중우선순위 큐 / Javascript (0) | 2021.01.10 |