프로그래머스 링크
https://school.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 |
코드풀이
우선 문제를 보자마자 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;
}
'프로그래머스 > lv2' 카테고리의 다른 글
프로그래머스 : 탐욕법(Greedy) > 큰 수 만들기(lv2) c++ (0) | 2023.05.05 |
---|---|
프로그래머스 : 연습문제 > 땅따먹기(lv2) c++ (0) | 2023.05.02 |
프로그래머스 : 2017 팁스타운 > 예상 대진표(lv2) c++ (0) | 2023.04.21 |
프로그래머스 : 연습문제 > 행렬의 곱셈(lv2) c++ (0) | 2023.04.20 |
프로그래머스 : 스택/큐 > 다리를 지나는 트럭(lv2) c++ (0) | 2023.04.15 |
댓글