-
프로그래머스 코딩테스트 - 단어 변환코딩테스트 풀이 2024. 11. 12. 17:59728x90
문제 설명
두 개의 단어 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 합니다.
해결 방법
아이디어
단어의 알파벳 하나씩 바꿔가며 가장 먼저 target에 도달하는 횟수를 찾는 것이기 때문에 리코쳇 문제를 해결할 때 처럼 BFS를 활용해 해결하면 된다.
- 단어 변화 큐 생성
- 첫 단어는 시작 단어, 변화 횟수는 0
- replaced: 이미 변환된 적 있는 단어
- 변환된 적 있는 단어를 따로 저장하지 않으면 계속 같은 단어로 변환되어 무한 루프에 빠지게 된다.
- BFS 시작
- 단어가 target과 동일하다면 count 반환
- words를 순회하면서
- 현재 word와 다른 알파벳이 하나이면서 이미 바꾼 적 있는 단어가 아니라면
- queue에 추가 (count 1 증가)
- replaced에 추가 (이미 바꾼 적 있다는 것을 기억)
- 이거 안하면 무한 반복에 빠짐
- 현재 word와 다른 알파벳이 하나이면서 이미 바꾼 적 있는 단어가 아니라면
코드
function solution(begin, target, words) { var answer = 0; const queue = [{word: begin, count: 0}] const replaced = [] while (queue.length) { const {word, count} = queue.shift(); if (target === word) return answer = count words.forEach((w) => { const diffCount = w.split("").filter((c, i) => c !== word[i]) if (diffCount.length === 1 && !replaced.includes(w)) { queue.push({word: w, count: count + 1}) replaced.push(w) } }) } return answer; }
결과
728x90'코딩테스트 풀이' 카테고리의 다른 글
프로그래머스 코딩테스트 - 단속카메라 (1) 2024.11.18 프로그래머스 코딩테스트 - 최고의 집합 (1) 2024.11.14 프로그래머스 코딩테스트 - 야근 지수 (0) 2024.11.11 프로그래머스 코딩테스트 - 광물 캐기 (0) 2024.11.10 프로그램머스 코딩테스트 - 피코쳇 로봇 (0) 2024.11.09