프로그래머스 > 코딩테스트 연습 > 깊이/너비 우선 탐색(DFS/BFS) > 단어 변환
function solution(begin, target, words) {
//words에 target이 없으면 0 리턴
if (words.indexOf(target) == -1) return 0;
//bfs?를 위해 만든 큐
let queue = new Array();
//나중에 글자 비교를 위해 target을 문자열 배열로 만들기
target = target.split("");
//words의 문자들도 문자열 배열로 각각 만들어 담기
for (i = 0; i < words.length; i++) {
words[i] = words[i].split("");
}
//큐에 begin 글자와 변형된 횟수인 0을 매개변수로 Word형으로 만들어 담는다
queue.push(new Word(begin.split(""), 0));
//큐가 0이 될 때까지 반복
while (queue.length > 0) {
//큐의 제일 첫번째 항목 가져오기
let word = queue.shift();
//항목의 글자와 변형 횟수 가져오기
let arr = word.w;
let index = word.index;
//만약 글자가 target과 동일하다면 바로 해당 횟수 리턴
if (check(arr, target) == 0) return index;
//words의 문자들을 하나씩 꺼내면서 글자와 비교
for (i = 0; i < words.length; i++) {
let count = words[i].length;
for (j = 0; j < words[i].length; j++) {
if (arr[j] == words[i][j]) count--;
}
//만약 글자 차이가 1개 밖에 없으면 큐에 넣으면서 words에서는 삭제
if (count == 1) {
queue.push(new Word(words[i], index+1));
words.splice(i, 1);
}
}
}
//while문이 끝나면 변형할 수 없는 것이기 때문에 0 리턴
return 0;
}
function check(w1, w2) {
let count = w1.length;
for (i = 0; i < w1.length; i++) {
if (w1[i] == w2[i]) count--;
}
return count;
}
class Word {
constructor(word, i) {
this.w = word;
this.index = i;
}
}
테스트 1 〉 통과 (0.33ms, 30.1MB)
테스트 2 〉 통과 (0.40ms, 30.2MB)
테스트 3 〉 통과 (0.57ms, 30MB)
테스트 4 〉 통과 (0.20ms, 30.3MB)
테스트 5 〉 통과 (0.10ms, 30.1MB)
자료형을 상관 안하고 그냥 바로 변환하면 되서 너무 편함 흑흑ㅠㅠ