728x90
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

[문제 설명]

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

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

 

제한사항

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

[문제 풀이]

처음 문제 풀이를 시작할때, 규칙이 있을거라고 생각했다.

완전탐색 문제로 분류되어있어서 일일이 계산해도 통과 될 것으로 생각되었지만, 빠른 속도로 하려면 규칙을 찾아내는것이 좋아보여서 노트에 계속 풀었다..

 

우선  제한사항을 확인해보면 word의 길이는 1 ≤ word ≤ 5이다.  

 

5번째 문자가 변경 되는 경우 (AAAAA -> AAAAE) 는 1씩 증가한다.

4번째 문자가 변경 되는 경우 (AAAA -> AAAE) 는 6(5 + 1)씩 증가한다 

3번째 문자가 변경 되는 경우 (AAA -> AAE)는 31(25+5+1)씩 증가한다.

2번째 문자가 변경 되는 경우 (AA -> AE)는 156(125+25+5+1)씩 증가한다. 

1번째 문자가 변경 되는 경우 (A -> E)는 781(625+125+25+5+1)씩 증가한다. 

 

위에서 본 규칙대로 앞 문자는 뒤의 문자가 변경되는데 필요한 값 + 각 자리의 5의 제곱이다.

5의 제곱인 이유는 문자가 5개(A,E,I,O,U)이기 때문이다.

 

주의해야 할 점은 위의 계산은 첫 문자가 있는 조건으로 더하는 값이다.

따라서 A 문자를 넣을때, 즉 처음에 값 1을 더해주어야 한다.

 

예를 들면, AA(2) -> AAE(34) 가 될 때 3번째 문자가 변경된다고 무작정 31을 더해주게 되면 AAAUU(33)가 나오게 된다. 

AAA(3)를 만들고나서 31을 더해주어야 정확히 AAE로 변경되므로

AAA(3) + 3번째 인덱스 값(31) 을 더해주어야 정확한 답을 찾을 수 있다.

 

파이팅 !

코드가 깨끗하고 명확하게 보일진 모르겠지만, 누군가에게 도움이 될 수도.. 있기에..

더보기
#include <string>
#include <vector>

using namespace std;

int adder[5] = {781,156,31,6,1};
char vowel[5] = {'A','E','I','O','U'};
int solution(string word) {
    int answer = 0;
    int wordSize = word.size();
    for(int i= 0; i < wordSize; i++)
    {
        int index = 0;
        answer += 1;
        while(vowel[index++] != word[i])
        {
            answer += adder[i];
        }
    }
    return answer;
}
복사했습니다!