본문 바로가기

Algorithm/문제풀이

Programmers - 단어변환 / Javascript

 

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;
}