02
19

1. 문제 설명

 

코딩테스트 연습 - 모음사전

사전에 알파벳 모음 'A', 'E', 'I', 'O', 'U'만을 사용하여 만들 수 있는, 길이 5 이하의 모든 단어가 수록되어 있습니다. 사전에서 첫 번째 단어는 "A"이고, 그다음은 "AA"이며, 마지막 단어는 "UUUUU"입니

programmers.co.kr

사전에 알파벳 모음 'A', 'E', 'I', 'O', 'U'만을 사용하여 만들 수 있는, 길이 5 이하의 모든 단어가 수록되어 있습니다. 사전에서 첫 번째 단어는 "A"이고, 그다음은 "AA"이며, 마지막 단어는 "UUUUU"입니다.

단어 하나 word가 매개변수로 주어질 때, 이 단어가 사전에서 몇 번째 단어인지 return 하도록 solution 함수를 완성해주세요.

 

2. 제한 사항

  • word의 길이는 1 이상 5 이하입니다.
  • word는 알파벳 대문자 'A', 'E', 'I', 'O', 'U'로만 이루어져 있습니다.

 

3. 입출력 예제

word result
"AAAAE" 6
"AAAE" 10
"I" 1563
"EIO" 1189

 

4. 나의 접근 방식

  • 가장 청음에 나올 'A' 부터 입력받은 word까지 모든 경우의 수를 배열에 담는다.
  • 사전의 규칙처럼, 한 모음을 돌고 나면 가장 마지막 앞의 모음이 다음 모음으로 바뀌고 가장 끝의 모음이 다시 변경되면서 모든 모음을 넣는 규칙이 있다.
  • 이를 통해 모든 순서를 배열에 담을 수 있다.

 

5. 결과

function solution(word) {
    let result = [];
    let words = ["A", "E", "I", "O", "U"];
    
    // 깊이를 계산할 함수를 선언한다.
    const getWord = (cur, depth) => {
        // 길이가 6이라면
        if (depth === 6) return;
        // 나온 모음의 묶음을 result에 넣는다.
        result.push(cur);

        // 반복문을 돌면서
        for (let i = 0; i < words.length; i++) {
            // 나온 모음에 다음 모음을 추가하면서 깊이를 더 해 준다.
            getWord(cur + words[i], depth + 1);
        }
    };
    
    // 이 과정을 word에서 받은 모음까지의 모든 모음의 묶음을 구한다.
    words.map((word) => getWord(word, 1));
    // 만들어진 모든 순서에 indexOf로 해당하는 모음을 찾아서
    // 0번째 부터 이기 떄문에 + 1 한다.
    return result.indexOf(word) + 1;
}

 

6.  개선점이 있다면?

  • 모든 경우의 수를 구한다는 것이 효율성이 매우 떨어진다. 더 간단하게 패턴을 이용해 풀 수는 없을까?
  • DFS를 이용하여 푸는 방식이 있다는데 찾아볼 필요가 있다.
  • 자료구조에 대한 자유로운 사용이 선행 되어야 더 쉽게 적용하고 풀 수 있을 것이다.
COMMENT