본문 바로가기
Algorithm/Weekly Solved

[위클리챌린지] 5주 - 모음사전 - Java코드

https://programmers.co.kr/learn/courses/30/lessons/84512#qna

 

코딩테스트 연습 - 5주차

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

programmers.co.kr

 

문제

 

이해

문제가  정해진 단어 안에서 규칙만 찾으면 되게 쉬울것 같다.

사전에 순서를 먼저 살펴보자

 

A - AA - AAA - AAAA - 
                              AAAAA - AAAAE - AAAAI - AAAAO - AAAAU
                     AAAE 
                              AAAEA  -AAAEE - AAAEI - AAAEO - AAAEU

... 순서로 진행된다

 

 

설계 

 

길이 5안에서 들어오는 문자열에 대해 자릿수별로 얼마만큼 늘어나는지 살펴보자

맨끝자리에 경우, AEIOU순서대로 바꿜때마다,  1씩 증가하게 되고

4번째 자리는 AEIOU순서대로 바꿜때마다 , 5번째 자리가 없는경우를 포함해 6씩 증가한다.

3번째 자리는 AEIOU순서대로 바꿜때마다 , 4번째 자리의 증가율 * 5 + 1 만큼 증가하여 31씩 증가하고

2번째 자리는 (31 * 5) +1 = 156 만큼

1번쨰 자리는 (156 * 5) +1 = 781만큼 증가한다.

 

이러한 점화식을 구했다면,

사전의 조합이 "AEIOU" 뿐 아니라 더 긴 조합이 INPUT으로 주어진다해도 문제를 풀 수 있을 것이다. 

 

답은

초기 input word의 길이만큼의 시작 포인트에서

각 자릿수의 증가율을 더해주면 몇번째 사전인지 구할 수 있다.

 

풀이

class Solution {
	public int solution(String word) {
		String str = "AEIOU";
		int[] x = {781,156,31,6,1};
		int index,result=word.length();
		for(int i=0;i<word.length();i++){
			index = str.indexOf(word.charAt(i));
			result+=x[i]*index;
		}
		return result;
	}
}

 

 

다른사람의 풀이

class Solution {
    public int solution(String word) {
        int answer = 0, per = 3905;
        for(String s : word.split("")) answer += "AEIOU".indexOf(s) * (per /= 5) + 1;
        return answer;
    }
}

이분은 781 * 5 의 수를 가지고 자릿수에 따라 나눠서 값을 사용해가면서 값을 더해주셨다.

나랑 설계는 비슷한데, 변수를 적게쓰시고 for문을 한줄로 줄여서 감탄따봉을 많이 받으신게 부럽다.

담번에 나도 초간결로 짜봐야지!..