프로그래머스 모음사전 (Java)

배인성·2022년 1월 6일
0

프로그래머스

목록 보기
5/55
post-thumbnail

링크

문제 링크

문제 설명

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

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

제한 사항

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

입출력 예제

입출력 예 설명

입출력 예 #1

사전에서 첫 번째 단어는 "A"이고, 그다음은 "AA", "AAA", "AAAA", "AAAAA", "AAAAE", ... 와 같습니다. "AAAAE"는 사전에서 6번째 단어입니다.

입출력 예 #2

"AAAE"는 "A", "AA", "AAA", "AAAA", "AAAAA", "AAAAE", "AAAAI", "AAAAO", "AAAAU"의 다음인 10번째 단어입니다.

입출력 예 #3

"I"는 1563번째 단어입니다.

입출력 예 #4

"EIO"는 1189번째 단어입니다.

풀이

  1. N번째 자리에 예를들어 U가 오기까지 몇번의 과정이 반복됐을까? 라는 생각을 가지고 문제를 쳐다봤을 때 수학적인 규칙이 떠올랐다.
  2. 5번째 자리의 알파벳이 6번을 진행하여 4번째 자리의 알파벳을 바꿀 수 있다.
  3. 4번째 자리의 알파벳이 3번째 자리의 알파벳을 바꾸기 위해서는 (2번과정 * 5) + 1 번을 진행해야한다.
  4. 3번째 자리의 알파벳이 2번째 자리의 알파벳을 바꾸기 위해서는 (3번과정 * 5) + 1번을 진행해야한다.
  5. 이렇게 수학적으로 접근하고나서 얻은 숫자로 배열을 선언하여 일반화하였다.
  6. 그리고나서 실행시키니 정답과 근소한 차이가 있었는데 주어진 String의 길이만큼 차이나는 것을 알게되었다!
  7. 처음 answer를 String의 길이로 초기화 시켜주고 해결!

이 문제는 입출력 예제를 쳐다보다가 I가 1563번째라는 것을 보고 영감을 얻었다.

A가 1번째, I가 1563번째면 E는? (1 + 1563) / 2 = 782가 되므로 첫 번째 자리의 알파벳이 바뀔 때마다 781이라는 값의 차이가 난다. 두 번째 자리도 마찬가지일것이라 생각했고 이 생각이 적중했던 것 같다!

선언한 num배열의 규칙은 n[i] = (n[i+1] * 5) + 1 이다!

코드

class Solution {
    public int solution(String word) {
        int answer = word.length();
        char[] ch = {'A', 'E', 'I', 'O', 'U'};
        int []num = {781, 156, 31, 6, 1};
        for(int i = 0; i < word.length(); i++){
            for(int j = 0; j < 5; j++){
                if(word.charAt(i) == ch[j])
                    answer += num[i] * j;                            
            }
        }
        System.out.println(answer);
        return answer;
    }
}
profile
부지런히 살자!!

0개의 댓글