const solution = (input) => {
const data = ['A', 'E', 'I', 'O', 'U'];
// data[]에서 r개를 뽑아 중복순열을 만드는 함수
function func(data, r) {
const result=[];
if(r===1) return data;
for (let i = 0; i < data.length; i++) {
const main = data[i];
const sub = data;
let permuteR = func(sub,r-1);
result.push(...permuteR.map((v)=>[main,...v]));
}
return result.map(v=>v.join(''));
}
let result = [];
// 1 ~ 5글자까지 모든 경우의 수를 result[] 에 추가하고
for(let i=1; i<=data.length; i++){
result = [...func(data,i), ...result];
}
// 사전순으로 정렬했다.
result.sort();
// 인덱스+1을 하면 n번째 라는 것을 알 수 있다.
return result.indexOf(input) + 1;
}
const solution = (words) =>
words.split('').reduce((누적값, 현재값, 인덱스) =>
누적값 + [781, 156, 31, 6, 1][인덱스] * ['A', 'E', 'I', 'O', 'U'].indexOf(현재값) + 1, 0)
어떻게 푸는 걸까?
통 이해가 가질 않는다만.. 추측해보자
모음사전에 들어갈 단어의 총 경우의 수는?
= (1글자 + 2글자 + 3글자 + 4글자 + 5글자)인 경우의 합
= (5 + 5^2 + 5^3 + 5^4 + 5^5)
= 3905
[781, 156, 31, 6, 1]
781
= 1번째 글자가 A인 경우의 수는 전체 3,905개 중 5분의 1 이므로 781개다.
156
= 1번째 글자가 정해졌을 때 2번째 글자가 'A'인 경우의 수는 781개 중 길이가 1인 경우를 제외한 780개 중 5분의 1이므로 156개다.
31
= 1,2번째 글자가 정해졌을 때 3번째 글자가 'A'인 경우의 수는 156개 중 길이가 2인 경우를 제외한 155개 중 5분의 1이므로 31개다.
6
= 1,2,3번째 글자가 정해졌을 때 4번째 글자가 'A'인 경우의 수는 31개 중 길이가 3인 경우를 제외한 30개 중 5분의 1이므로 6개다.
1
= 1,2,3,4번째 글자가 정해졌을 때 5번째 글자가 'E'인 경우의 수는 6개 중 길이가 4인 경우를 제외한 5개 중 5분의 1이므로 1개다.
그다음은 어렴풋이 이해는 가지만 확실히는 모르겠다
'AAAAE' 가 입력되면
첫 번째 'A':
[781, 156, 31, 6, 1][0] * ['A', 'E', 'I', 'O', 'U'].indexOf('A') + 1
= 781 * 0 + 1
= 1
두 번째 'A':
[781, 156, 31, 6, 1][1] * ['A', 'E', 'I', 'O', 'U'].indexOf('A') + 1
= 156 * 0 + 1
= 1
세 번째 'A':
[781, 156, 31, 6, 1][2] * ['A', 'E', 'I', 'O', 'U'].indexOf('A') + 1
= 31 * 0 + 1
= 1
네 번째 'A':
[781, 156, 31, 6, 1][3] * ['A', 'E', 'I', 'O', 'U'].indexOf('A') + 1
= 6 * 0 + 1
= 1
'E':
[781, 156, 31, 6, 1][4] * ['A', 'E', 'I', 'O', 'U'].indexOf('E') + 1
= 1 * 1 + 1
= 2
따라서 누적값 = 6 이 반환된다
1 + 1 + 1 + 1 + 2 = 6