본문 바로가기
개발/알고리즘

[프로그래머스][LEVEL2] 모음 사전

by ISA(류) 2021. 10. 18.

# 문제 원문

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

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

제한사항

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

입출력 예

word / result

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

 

# 문제 풀이

 

임의의 규칙을 가진 사전의 특정 단어 순서를 찾는 문제이다. 규칙을 이해하고 찾는데 시간이 걸리므로 그냥 사전을 만들었다. 다행히 효율성을 크게 따지진 않아서 문제가 되진 않은듯. 통과후 다른 사람 풀이를 확인해 보니 경우의 수를 계산해서 처리하는 효율적인 코드가 존재하더라. 실제로는 그냥 수학 문제 인것 같다.

 

# 솔루션 플로우

1. 사전을 이루는 AEIOU 배열을 반복한다. 가장 긴 단어가 5자리이니 5까지 5번 반복하면 된다.

2. 해시 맵에 순서대로 만들어지는 단어들을 그 idx를 value로 해서 삽입한다.

3. 정답과 동일한 단어가 나오면 반복을 중단한다.

4. 얻어진 result를 반환한다.

1. 해시맵과 재귀 함수(반복)를 활용한 풀이

function solution(word) {
    return ['A', 'E', 'I', 'O', 'U'].reduce((result, c, _, char) => {
        const rec = (state, n) => {
            if (!result.has(word)) {
                char.some((current) => {
                    state.push(current);
                    const check = state.join('');
                    if (!result.has(check)) {
                        result.set((check), result.size + 1);
                        if (check === word) return true;
                    }
                    if (n > 0) {
                        rec(state, n - 1);
                    }
                    state.pop();
                });
            }
        }
        rec([], 4);

        return result;
    }, new Map()).get(word);
}
반응형