2022. 9. 26. 00:35ㆍAlgorithm/프로그래머스
level : 3
문제 링크 : 단어 변환
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
My Solution
function solution(begin, target, words) {
let answer = 0;
words = new Set(words);
if(!words.has(target))
return answer;
let queue = [[begin, 0]];
while(queue.length>0){
const [word, num] = queue.shift();
if(word === target){
answer = num;
break;
}
for(let i of words){
let counter = 0;
i.split('').forEach((char,index)=>{
if(char!==word[index])
counter++;
})
if(counter===1){
queue.push([i,num+1]);
words.delete(i);
}
}
}
return answer;
}
풀이방법
answer를 0으로 초기화 한다.
words에 target이 없다면 answer를 반환한다.
queue에 [단어, 단계]의 배열을 원소로 가지는 2차원 배열을 만든다. [[begin, 0]]으로 초기화한다.
queue의 길이가 0보다 클때까지 아래의 내용을 반복한다.
word, num을 queue에서 Dequeue하여 나온 값으로 초기화한다. 이 때, word가 target과 같다면 num을 answer에 할당하고 반복문을 종료한다.
word에 있는 단어들을 비교하여 1개의 알파벳만 다른 것과 num+1을 queue에 Enqueue한다.
반복문 종료 후, answer를 return한다.
느낀점
이 문제에서 테스트 케이스가 완벽하지 않다고 느꼈다.
begin(string) = "hit", target(string) = "cog", words(string[]) = ["hot", "dot", "cog"], Return = 0
아래의 solution은 위에서의 solution을 약간 변형했고 위의 testcase를 통과하지 못한다. 하지만 제출하면 통과가 된다. (문제의 오류인가 출제자의 실수인가.. 잘은 모르겠다.)
function solution(begin, target, words) {
words = new Set(words);
if(!words.has(target))
return 0;
let queue = [[begin, 0]];
while(queue.length>0){
const [word, num] = queue.shift();
if(word === target)
return num;
for(let i of words){
let counter = 0;
i.split('').forEach((char,index)=>{
if(char!==word[index])
counter++;
})
if(counter===1){
queue.push([i,num+1]);
words.delete(i);
}
}
}
}
생각해 보니 words.delete(i) 부분은 굳이 필요 없는 부분이었다. 그러니 굳이 words를 Set Object로도 안 바꾸어도 되는 문제였다.. 다음에는 신경써서 판별해야 겠다.
'Algorithm > 프로그래머스' 카테고리의 다른 글
| [JavaScript] 혼자 놀기의 달인 (0) | 2023.04.22 |
|---|---|
| [Python] 숫자 짝꿍 (0) | 2022.10.20 |
| [JavaScript] 다음 큰 숫자 (0) | 2022.09.25 |
| [JavaScript] 야근 지수 (0) | 2022.09.17 |
| [JavaScript] 베스트앨범 (0) | 2022.09.17 |