모음사전

[문제 Link] https://programmers.co.kr/learn/courses/30/lessons/84512

문제 설명


사전에 알파벳 모음 ‘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

사전에서 첫 번째 단어는 “A”이고, 그다음은 “AA”, “AAA”, “AAAA”, “AAAAA”, “AAAAE”, … 와 같습니다. “AAAAE”는 사전에서 6번째 단어입니다.

입출력 예 #2

“AAAE”는 “A”, “AA”, “AAA”, “AAAA”, “AAAAA”, “AAAAE”, “AAAAI”, “AAAAO”, “AAAAU”의 다음인 10번째 단어입니다.

입출력 예 #3

“I”는 1563번째 단어입니다.

입출력 예 #4

“EIO”는 1189번째 단어입니다.


로직


쉽게 for문으로만 풀수 있을 줄 알았지만, 무조건 시간 초과가 뜨게 되어있는 문제이다.

사전의 순서를 보면, A - AA - AAA - AAAA - AAAAA - AAAAE - AAAAI - AAAAO -AAAAU - AAAE - AAAEA … 순서로 진행된다.

맨 끝자리의 경우 index가 1씩 증가하게 되고,

4번째 자리의 경우에는 index가 6씩 증가하게 된다.(없는 경우 포함)

3번째 자리의 경우에는 index가 31씩 증가하게 된다. ((6*5) +1 )

2번째 자리의 경우에는 index가 156씩 증가한다. ((31* 5) +1)

1번째 자리의 경우에는 index가 781씩 증가하게 된다.((156 * 5)+1)

이러한 식을 통해 단어의 index에 빠르게 도달할 수 있다.

전체 코드


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

class Solution
{
    public static int solution(string word) {
        string str = "AEIOU";
        int[] inc = new int[] {781,156,31,6,1};
        int index,result=word.Length;
        for(int i =0;i<word.Length;i++)
        {
            index= str.IndexOf(word[i]);
            result += inc[i] * index;
        }
        return result;
    }


    public static void Main(string[] args)
    {
        string word = "AAAAE";
        Console.WriteLine(solution(word));
        
        
    }
}


결과