Lv.2 - 모음사전

송철진·2024년 2월 25일
0

프로그래머스-JavaScript

목록 보기
116/116
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
profile
검색하고 기록하며 학습하는 백엔드 개발자

0개의 댓글