[JS] 단어 변환
2022. 5. 5. 22:37
🔒 문제 (프로그래머스 DFS/BFS)
두 개의 단어 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 합니다.
🌊 입출력
begin | target | words | return |
"hit" | "cog" | ["hot", "dot", "dog", "lot", "log", "cog"] | 4 |
"hit" | "cog" | ["hot", "dot", "dog", "lot", "log"] | 0 |
🔑 해결
🌌 알고리즘 - BFS
begin에서 target까지 변환할 수 있는 최단 경로의 거리를 구하는 문제와 같고, 변환 과정을 기억할 필요가 없으므로 DFS 보다 BFS를 사용한다.
큐를 이용하여 BFS를 구현하는데, 큐에 노드를 넣을 때 단어와 변경 횟수를 같이 넣어 최소 횟수를 구한다.
function solution(begin, target, words) {
// 두 문자열을 비교하여 알파벳 하나만 다른지 검사하는 함수
function isConvertible(from, to) {
let diff = 0;
for(let i = 0 ; i < from.length; i++) {
if(from[i] !== to[i])
diff++;
}
return diff == 1;
}
let answer = 0;
const q = [];
const visited = Array(words.length);
q.push([begin, 0]); // [시작 단어, 변경 횟수]를 루트 노드로 설정
// BFS
while(q.length) {
// 큐에서 꺼낸 현재 노드의 [단어, 변경 횟수]를 활용할 수 있도록 설정
let [str, count] = q.shift();
// 현재 노드 방문 여부 체크
visited.push(str);
// 현재 노드의 단어가 target과 일치하면 변경 횟수 반환
if(str === target)
return count;
// 방문하지 않았으며 변환 가능한 모든 노드를 큐에 넣어 다음 노드로 설정
words.forEach((word, index) => {
if(!visited.includes(word) && isConvertible(str, word))
q.push([word, count+1]); // 변경 횟수 같이 넣기
});
}
return answer;
}
'코딩테스트 (JS) > DFS | BFS' 카테고리의 다른 글
[JS] 빛의 경로 사이클 (0) | 2022.06.26 |
---|---|
[JS] 가장 먼 노드 (0) | 2022.06.11 |
[JS] 여행경로 (0) | 2022.05.15 |
[JS] 네트워크 (0) | 2022.04.24 |
[JS] 타겟 넘버 (0) | 2022.04.24 |