BFS를 활용하여 간단한 풀이가 가능하다.
주요 로직은 다음과 같다.
function ladderLength(beginWord: string, endWord: string, wordList: string[]): number {
// wordList를 Set으로 변환하여 O(1) 시간에 단어 존재 여부를 확인할 수 있게 함
const wordSet = new Set(wordList);
// endWord가 wordList에 없으면 변환이 불가능하므로 0 반환
if (!wordSet.has(endWord)) return 0;
// BFS를 위한 큐 초기화
// [단어, 지금까지의 변환 횟수]를 저장
const queue: [string, number][] = [[beginWord, 1]];
// 이미 방문한 단어를 저장하는 Set
const visited = new Set<string>();
visited.add(beginWord);
while (queue.length > 0) {
const [currentWord, level] = queue.shift()!;
// 현재 단어의 각 위치를 a-z로 변경해보며 가능한 다음 단어들을 찾음
for (let i = 0; i < currentWord.length; i++) {
for (let c = 97; c <= 122; c++) { // 'a'(97)부터 'z'(122)까지
const newWord =
currentWord.slice(0, i) +
String.fromCharCode(c) +
currentWord.slice(i + 1);
// endWord를 찾으면 현재까지의 레벨 + 1을 반환
if (newWord === endWord) {
return level + 1;
}
// 새로운 단어가 wordSet에 있고 아직 방문하지 않았다면 큐에 추가
if (wordSet.has(newWord) && !visited.has(newWord)) {
visited.add(newWord);
queue.push([newWord, level + 1]);
}
}
}
}
// 변환 sequence를 찾지 못한 경우 0 반환
return 0;
}