Lv_2. 모음사전

2021. 11. 6. 21:43Algorithm Problem Solving

* Programmers _위클리 챌린지 5주차 문제입니다.

* 언어는 javascript 를 선택했습니다.

 

1. 문제

1) 모음사전

사전에 알파벳 모음 'A', 'E', 'I', 'O', 'U'만을 사용하여 만들 수 있는, 길이 5 이하의 모든 단어가 수록되어 있습니다. 사전에서 첫 번째 단어는 "A"이고, 그다음은 "AA"이며, 마지막 단어는 "UUUUU"입니다.

단어 하나 word가 매개변수로 주어질 때, 이 단어가 사전에서 몇 번째 단어인지 return 하도록 solution 함수를 완성해주세요.

 

2) 제한사항

  • word의 길이는 1 이상 5 이하입니다.
  • word는 알파벳 대문자 'A', 'E', 'I', 'O', 'U'로만 이루어져 있습니다.

 

2. 알고리즘! 생각해보자

처음에는 문제가 이해가지 않아 주르륵 나열해보니

약간의 규칙을 찾을 수 있었습니다.

1: A <-> 781 782(=1+781): E      
2: AA <-> 156 158(=2+156): AE      
3: AAA <-> 31 34(=3+31): AAE AAI AAO AAU
4: AAAA <-> 6 10(=4+6): AAAE AAAI AAAO AAAU
5: AAAAA <-> 1        
6: AAAAE        
7: AAAAI        
8: AAAAO        
9: AAAAU        

 

word는 1~5자리인데, _ _ _ _ _ 각 자리수 별로

첫번째 자리는 781 

두번째 자리는 156

세번째 자리는 31

네번째 자리는 6

다섯번째 자리는 1

씩 차이가 나는 것을 확인할 수 있었습니다.

 

그런데 입출력 예시와 값을 비교해보면, 위의 값 만으로는 해결되지 않는 것을 확인할 수 있습니다.

예를들어, "EIO" 의 경우 1189 이 출력되어야 하는데, 

위의 값으로 계산하면, (781 * 1) + (156 * 2) + (31 * 3) =  781 + 312 + 93 = 1186 으로 정답과 3 차이가 납니다.

 

지금까지 계산한 것은 A <-> E 의 차이라는 것을 놓친 것입니다.

그래서 시작값인 A(1), EA(1), EIA(1) 의 3가지 경우를 추가하면, 정답과 일치하게 됩니다.

(이 값은 결국 word 의 길이가 되겠더라구요!)

 

저는 그래서 코딩할 때 각 경우를 vertical, horizontal 값을 계산하는 것이라고 생각하고

아래와 같은 코드를 도출하였습니다.

answer = getHorizonLen(word) + getVerticalLen(word)

 

3. 해결 코드

function solution(word) {
    var answer = getHorizonLen(word) + getVerticalLen(word);
    return answer;
}

function getVerticalLen(word) {
    const wordList = ['A', 'E', 'I', 'O', 'U'];
    let result = 0;
    word.split('').forEach((item, idx) => {
        const wordIdx = +wordList.indexOf(item);
        const multiplyVal = [781, 156, 31, 6, 1];
        result += wordIdx * multiplyVal[idx];
    });
        
    return result;
}

function getHorizonLen(word) {
    return word.length;
}

 

4. 문제해결 능력 UP! 되짚어보기

  • 같은 알고리즘인데, 한 줄 풀이
function solution(words) {
    return words.split('').reduce((r, c, i) => r + [781, 156, 31, 6, 1][i] * ['A', 'E', 'I', 'O', 'U'].indexOf(c) + 1, 0);
}
  • DFS
function solution(word) {
    function dfs(p) {
        if (p.length > 5) return;

        answer[p] = cnt;
        cnt++;
        for (let w of "AEIOU") {
            dfs(p + w);
        }
    }

    const answer = {};
    let cnt = 0;
    dfs("");
    return answer[word];
}

 

5. References

 

'Algorithm Problem Solving' 카테고리의 다른 글

Lv2. 전력망을 둘로 나누기  (0) 2021.11.20
Lv_2. 3주차_퍼즐 조각 채우기  (0) 2021.11.13
Lv01. 최소 직사각형  (0) 2021.11.12
Lv_1. 부족한 금액 계산하기  (0) 2021.11.06