작성일 : 2024.11.16
단어 변환 문제
문제 설명
시작 단어(begin)를 목표 단어(target)로 변환하는데 필요한 최소 단계를 찾는 문제입니다.
변환 규칙
- 한 번에 한 글자만 변경 가능
- words 배열에 있는 단어로만 변환 가능
예시
begin: "hit"
target: "cog"
words: ["hot","dot","dog","lot","log","cog"]
변환 과정: "hit" -> "hot" -> "dot" -> "dog" -> "cog"
답: 4 (4단계)
제한 조건
-
단어 제한
- 알파벳 소문자로만 구성
- 길이: 3 ≤ 길이 ≤ 10
- 모든 단어의 길이는 동일
-
words 배열
- 크기: 3 ≤ 크기 ≤ 50
- 중복 단어 없음
해결 코드 (DFS 방식)
function solution(begin, target, words) {
if (!words.includes(target)) return 0;
let answers = [];
const dfs = (word, index, level, visit) => {
if (index >= words.length) return;
for (let i = 0; i < word.length; i++) {
const letter = sliceWord(word, i);
const temp = words.filter(
(v) => !visit.has(v) && sliceWord(v, i) === letter
);
if (temp.includes(target)) {
answers.push(level + 1);
return;
}
temp.map((v, i) => {
const visited = new Set([...visit]);
visited.add(v);
dfs(v, i, level + 1, visited);
});
}
};
const sliceWord = (word, i) => {
let wordArr = word.split("");
wordArr.splice(i, 1);
return wordArr.join("");
};
dfs(begin, 0, 0, new Set());
return answers.length < 1 ? 0 : Math.min(...answers);
}
해결 코드 (BFS 방식)
function solution(begin, target, words) {
if (!words.includes(target)) return 0;
let answer = 0;
let temp = [];
const visited = new Set();
const queue = [];
queue.push(begin);
while (queue.length) {
const word = queue.shift();
visited.add(word);
if (word === target) {
return answer;
}
for (let i = 0; i < word.length; i++) {
const letter = sliceWord(word, i);
const matched = words.filter(
(v) => !visited.has(v) && sliceWord(v, i) === letter
);
temp.push(...matched);
}
if (queue.length < 1) {
answer++;
queue.push(...temp);
temp = [];
}
}
return answer;
}
알고리즘 설명
DFS 방식
- 각 단계에서 한 글자씩 변경 가능한 모든 단어 탐색
- 방문 처리를 통해 중복 방문 방지
- 목표 단어 도달 시 현재까지의 단계 수 저장
- 모든 경로 탐색 후 최소값 반환
BFS 방식
- 큐를 사용하여 현재 단계에서 가능한 모든 변환 탐색
- 각 레벨별로 단계 수 증가
- 목표 단어 도달 시 현재 단계 수 반환
- 더 이상 변환이 불가능할 때까지 반복
주요 메서드 설명
- Set 객체 활용
const visited = new Set(); // 방문 처리
visited.add(word); // 방문 표시
!visited.has(word); // 미방문 확인
- 배열 메서드
words.filter(); // 조건에 맞는 단어 필터링
queue.shift(); // 큐에서 단어 추출
temp.push(); // 임시 배열에 단어 추가