ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스 코딩테스트 - 단어 변환
    코딩테스트 풀이 2024. 11. 12. 17:59
    728x90

    문제 설명

    두 개의 단어 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에 추가 (이미 바꾼 적 있다는 것을 기억)
            • 이거 안하면 무한 반복에 빠짐

    코드

    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

    댓글

Designed by Tistory.