[Programmers] 다음 큰 숫자

#
CodingTest
#
Study

1.문제

문제링크

문제설명

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

2. 접근방법

깊이 우선 탐색을 사용하여 재귀 함수를 이용하여 문제를 해결했습니다. 각 단계에서는 현재 단어와 한 글자만 다른 단어를 찾고, 해당 단어를 새로운 시작 단어로 하여 재귀적으로 함수를 호출합니다. 이때 사용한 단어는 배열에서 삭제하여 중복해서 사용하지 않도록 합니다.

3. 최종코드

1function solution(begin, target, words) { 2 var answer = 0; 3 if (!words.includes(target)) return 0; 4 5 function search(_begin, others, result) { 6 if (_begin.join("") === target) { 7 if (answer === 0 || result < answer) { 8 answer = result; 9 } 10 return; 11 } 12 13 for (let i = 0; i < others.length; i++) { 14 let check = 0; 15 for (let l = 0; l < others[i].length; l++) { 16 const a = others[i].split(""); 17 if (_begin[l] === a[l]) { 18 check++; 19 } 20 } 21 if (check === _begin.length - 1) { 22 search( 23 [...others[i]], 24 [...others.slice(0, i), ...others.slice(i + 1)], 25 result + 1 26 ); 27 } 28 } 29 } 30 31 search(begin.split(""), words, 0); 32 return answer; 33} 34