두 개의 단어 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 함수를 작성해주세요.
begin | target | words | return |
---|---|---|---|
"hit" | "cog" | ["hot", "dot", "dog", "lot", "log", "cog"] | 4 |
"hit" | "cog" | ["hot", "dot", "dog", "lot", "log"] | 0 |
문제에 나온 예와 같습니다.
target인 "cog"는 words 안에 없기 때문에 변환할 수 없습니다.
처음에는 words
를 sort()
를 해서 bfs를 사용할까 생각했지만 정렬을 한다고 해도 알파벳이 하나씩 다른지 여부를 체크해야 한다는 것을 알게 되었다.
따라서 isConnect()
라는 함수를 따로 만들어서 두 단어의 같은 인덱스 값을 비교하여 다른 알파벳의 개수가 1개라면 true
를, 아니라면 false
를 리턴하도록 했다.
그 후 단어별로 거쳐간 과정의 개수를 세야 하는데 객체를 어떻게 사용할지 고민이 됐다. 사실 이번에 { [begin]: 0 }
형태를 처음 사용해 봤다. { begin: 0 }
로 지정하면 key 값이 "begin"이 되기 때문에 key 값으로 begin에 저장된 값을 넣고 싶을 때는 [begin]
형태로 작성해야 한다.
정리하자면 다음과 같다.
{ [begin]: 0 }
begin
변수의 값을 이용하여 객체의 속성명을 동적으로 생성{ begin: 0 }
전체 코드는 다음과 같다.
// 두 단어가 한 개의 알파벳만 다른지 체크하는 함수
function isConnect(word1, word2) {
const len = word1.length;
let cnt = 0; // 다른 알파벳 개수
for (let i = 0; i < len; i++) {
if (word1[i] !== word2[i]) cnt++;
}
return cnt === 1 ? true : false;
}
function solution(begin, target, words) {
// 단어별 거친 과정 개수 저장
// begin 그대로 넣으면 begin이 key로 설정됨
let visited = { [begin]: 0 };
let queue = [begin];
// bfs
while (queue.length > 0) {
let currentWord = queue.shift();
if (currentWord === target) break; // 목적지 도착 여부 체크
for (let word of words) {
// 알파벳이 하나만 다르고, 아직 체크하지 않은 단어라면
if (isConnect(currentWord, word) && !visited[word]) {
queue.push(word);
visited[word] = visited[currentWord] + 1; // 과정 수 증가시키기
}
}
}
return visited[target] ? visited[target] : 0;
}
이번에 처음 사용한 만큼 계산된 속성명에 잠깐 정리해 보려고 한다.
[ ]
안에 식을 넣고 그 결과가 속성명으로 사용됨// 계산된 속성명 미사용
function makeObj1(key, value) {
const obj = {};
obj[key] = value;
return obj
}
// 계산된 속성명 이용
function makeObj2(key, value) {
return {[key]: value}
}
-[key]
값이 key의 이름으로 동적으로 할당됨