강의로 돌아가기
emptyDrawing

수학적으로 풀어보기?

우선 총 5개의 문자가 돌아간다는 것에서 5진수를 생각해봤습니다.
그리고 직감적으로 생각해보면 왠지 자리수라는 것도 생각해 볼수 있는데

그럼 자리수의 정보가
54 , 53, 52, 51 , 50
로 표현되지 않을까 하는 발상에서 출발해봤습니다.

그런데 이러면 실제 문제와 맞지 않는데
한번 간단히 문제의 예시를 나열해보고, 몇개의 케이스를 추가해보았습니다.

A => 1
AA => 2
AAA => 3
AAAA => 4
AAAAA =>5
AAAAE => 6
AAAE => 10
AAE => 34

여기서 좀 조심히 관찰해보면
A는 자리 수에 관계없이 +1 의 정보만 리턴하고
E 는 어떤 자리 수 에 따라 특이한 정보값을 증가시키는데요.

AAAAE(6) 은 AAAAA(5) 보다 1 차이가 나고
AAAE(10) 은 AAAA(4) 보다 6 차이가 나고 AAAAA(5) 보다는 5 차이가 납니다.
AAE(34) 는 AAA(3) 보다 31 차이가 나고 AAAE(10) 보다는 25 차이가 납니다.

네 처음에 생각했던 54, 53, 52, 51, 50 의 패턴도 보이는데요
실제 같은 자리 수의 단어를 비교( AAAE, AAAA 간 비교 등) 에서는
다음과 같은 공식으로 동작합니다.


각 자리는 이전 자리들의 가중치 [ 54, 53, 52, 51, 50 ] 를 가짐.
따라서 AAE 에서 'E' 는 이전 자리수 52 + 51 + 50 = 31 의 가중치를 가지는데
E 는 [ 'A', 'E', 'I', 'O', 'U' ] 에서 두번째(인덱스로는 1) 을 이기 때문에
[ 31 * index + 1 ] 의 정보를 가진다.


여기서 +1 을 하는 이유는 단어의 누적, A가 항상 +1 정보를 누적하는 것에서 영감을 얻었습니다.
그래서 한번 테스트 코드에 있는 "I"(1563) 를 한번 공식으로 풀어보면,
(54 + 53 + 52 + 51 + 50 ) * 2 + 1 = ( 625 + 125 + 25 + 5 + 1 ) * 2 + 1 = 781 * 2 + 1 = 1563
으로 공식이 성립함을 알 수 있습니다!

그래서 이걸 한번 코드로 구현해본 소스가 아래 소스입니다.
소스는.. 좀더 깔끔하게도 작성가능 할 것 같습니다...

작성중인 코드―solution.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function solution(word) {
    var answer = 0;
    let strArr = ['A', 'E', 'I', 'O', 'U']
    let wordArr = [...word];

    for( const [index, value] of wordArr.entries()){
        let num = strArr.findIndex(a => a == value);
        answer += getInfoNum(index) * num + 1;
    }


    return answer;
}

function getInfoNum(idx) {
    let sum = 0;
    let count = 0;
    while(count <= 4 - idx) {
        sum += (5 ** count++);
    }
    return sum;
}
  • jay

    짱이십니다 감사합니다

    jay―2023.09.12 14:22
1 개의 답변
1000zoo

좋은 아이디어 감사합니다!

답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다. 마크다운 가이드 를 참고하세요.