안녕하세요

프로그래머스 JS [모음 사전] 본문

프로그래머스/Lv.2

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

sakuraop 2022. 12. 4. 23:10

모음 사전 문제보기

문제 설명

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

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

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

입출력 예wordresult
"AAAAE" 6
"AAAE" 10
"I" 1563
"EIO" 1189

재귀를 쓰는 방법을 여전히 잘 모르겠다...
재귀를 쓰기는 했지만 사실상 while 반복문의 continue랑 별반 차이가 없다.
안 풀리는 문제 계속 붙잡기보다는 여러 문제를 접한 뒤에
이후에 부족한 부분에 대해서 집중 공략하기로 하자.

function solution(word) {
    const vowel = {
        A: "E",
        E: "I",
        I: "O",
        O: "U",
    };

    const c = ["A"];
    let count = 0;

    const dfs = (wordArray, word) => {
        count++;
        // 문자와 일치하면 count 반환
        if (wordArray.join("") === word) return count;
        // 문자열의 길이가 5보다 작으면 A를 더하기
        if (wordArray.length < 5) {
            wordArray.push("A");
            dfs(wordArray, word);
            return;
        }
        // 마지막 문자열이 U가 아니라면 문자 변환 순서에 따라 변환
        if (wordArray[4] !== "U") {
            wordArray[4] = vowel[c[4]];
            dfs(wordArray, word);
            return;
        }
        // 변환 규칙에 따라 U 앞의 문자열 변환하기
        for (let i = wordArray.length - 1; i > 0; i--) {
            if (wordArray[i - 1] !== "U" && wordArray.slice(i).join("") === "U".repeat(wordArray.length - i)) {
                wordArray[i - 1] = vowel[wordArray[i - 1]];
                // 변환 뒤에는 U 제거하기
                for (let j = 0; j < 5 - i; j++) {
                    wordArray.pop();
                }
                dfs(wordArray, word);
                break;
            }
        }
    };

    dfs(c, word);
    console.log(count, c.join(""), "count");
    return count;
}
solution("I");