프로그래머스/lv2

프로그래머스 : 완전탐색 > 모음사전(lv2) c++

TIN9 2023. 4. 23.
반응형

프로그래머스 링크

https://school.programmers.co.kr/learn/courses/30/lessons/84512

 

프로그래머스

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

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 | result
"AAAAE" 6
"AAAE" 10
"I" 1563
"EIO" 1189

코드풀이

우선 문제를 보자마자 5진법이 떠올랐다

하지만 진법풀이법이랑은 살짝 다른게 A = 1이고 AAAAAA는 5가 되는부분이다

다만 조금만 생각해보면 나름 비슷한 풀이법으로 풀이가 가능한것을 알 수 있다.

모든 문자의경우 A, E, I, O, U 총 5가지의 문자로만 이루어져있기 때문에

5^n 과 관련되어 있다는것을 알 수 있다.

 

만약에 I의 경우

자리수에 맞게끔

5^4 + 5^3 + 5^2 + 5^1 + 5^0을 해준다음

A,E,I,O,U의 인덱스 만큼을 곱해주면

I = (625 + 125 + 25 + 5 + 1) * 2(I번째 인덱스) = 1562가 되는것을 볼 수 있다.

여기서 기본 A는 +1이라는 값을 갖게되니깐 기본적인 + 1을 더해주어 최종 1563의 결과가 된다.

 

그럼 EIO의 경우

(625 + 125 + 25 + 5 + 1) * 1 + 1

+ (125 + 25 + 5 + 1) * 2 + 1

+ (25 + 5 + 1) * 3 + 1

= 782 + 313 + 94

= 1189

가 되는것을 알 수 있다.

코드

#include <string>
#include <vector>
#include <cmath>

using namespace std;

// A, E, I, O, U가 몇번째 문자인지 찾기위한 함수
// A = 0번 인덱스 E = 1번 인덱스 .... 
int CheckIndex(const char word)
{
    int Numb = 0;

    if(word == 'A')
        Numb = 0;
    else if(word == 'E')
        Numb = 1;
    else if(word == 'I')
        Numb = 2;
    else if(word == 'O')
        Numb = 3;
    else if(word == 'U')
        Numb = 4;

    return Numb;
}

// 총 몇번째 값인지 판단하는 함수
int ConvertFunc(const string& word)
{
    int Count = 0;

    size_t Size = word.size();

    for(int i = 0; i < Size; ++i)
    {
        if(word[i] == 'A')
        {
            ++Count;
        }
        else
        {
            int Index = 5 - i;

            int AddNumb = 0;

            while(Index >= 0)
            {
                -- Index;
                AddNumb += pow(5, Index);
            }

            Count += (AddNumb * CheckIndex(word[i])) + 1;
        }
    }

    return Count;
}

int solution(string word) {
    int answer = 0;

    answer = ConvertFunc(word);

    return answer;
}

 

 

반응형

댓글