Alogorithm

[Algorithm] LeetCode - 1641. Count Sorted Vowel Strings(Dynamic Programming)

Daniel(빡일) 2022. 1. 23. 15:48
반응형

 

LeetCode 문제입니다.

[문제설명]

Given an integer n, return the number of strings of length n that consist only of vowels (a, e, i, o, u) and are lexicographically sorted.

A string s is lexicographically sorted if for all valid i, s[i] is the same as or comes before s[i+1] in the alphabet.

 

번역)

n이 주어졌을 때, 모음(a, e, i, o, u)로 구성되어 있고 정렬된 n 크기의 문자열 개수를 구하시오.
모든 유효한 i에 대해 s[i]가 알파벳에서 s[i+1]과 같거나 그 앞에 오는 경우 문자열 s는 사전순으로 정렬됩니다.

   -> 모음으로 구성된 문자열 s(크기는 n)의 경우의 수를 구하되, 사전 정렬순이어야한다.

 

 

Topic: Dynamic Programing

Level: Medium

Accepted 76,595 /Submissions 102,380


[제한사항]

  • 1 <= n <= 50 

[입출력]

예시 1

Input: n = 1
Output: 5
Explanation: The 5 sorted strings that consist of vowels only are ["a","e","i","o","u"].

 

예시 2

 

Input: n = 2
Output: 15
Explanation: The 15 sorted strings that consist of vowels only are
["aa","ae","ai","ao","au","ee","ei","eo","eu","ii","io","iu","oo","ou","uu"].
Note that "ea" is not a valid string since 'e' comes after 'a' in the alphabet.

예시 3

Input: n = 33
Output: 66045

[문제풀이]

/**
 * @param {number} n
 * @return {number}
 */
var countVowelStrings = function(n) {
    // constraints 1
    if (n < 1 || n > 50 ) return false
    if (n === 1)  return 5 
    
    
    let result = 0
    const vowels = ["a","e","i","o","u"]
    
    const recursiveMatch = (num, lastVowel) => {
        // Finish making 
        if (num === n) return result++
        
        for (let i = vowels.indexOf(lastVowel); i < 5; i++) recursiveMatch(num + 1, vowels[i])    
        
    }
    

     recursiveMatch(1, "a")
     recursiveMatch(1, "e")
     recursiveMatch(1, "i")
     recursiveMatch(1, "o")
     recursiveMatch(1, "u")  
    
    return result
};

 

Idea: 

1. 각 vowel(모음)이 첫번째 alphabet인 경우를 나누어서 생각한다.

2. vowels는 모음이 정렬된 변수이다.

3. recursiveMatch 함수는 num번째 idx에 lastVowel(모음)을 input으로 하는 함수이다.

  -> num이 n이 되었을 경우엔 카운트를 한다. n번째에 lastVowel이 들어갔기 때문.

  -> lastVowel의 vowels idx부터 recursiveMatch함수를 n+1하여 재호출 한다.

      -> lastVowel과 같거나 후순서인 alphabet을 보장한다.


[Performance]

반응형