글 작성자: bbangson
반응형

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

 

코딩테스트 연습 - 5주차_모음사전

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

programmers.co.kr

모음사전


 

난이도 :  Level 2 

 

 규칙을 찾는 것이 관건인 문제입니다. 

 

 아래 순서대로 로직을 짰습니다. 

1. 규칙을 구한다.

2. 점화식을 구한다. 

 

 

1. 규칙을 구한다. 

 주어진 문제의 규칙대로 문자열을 순서대로 작성하면 아래와 같은 순서가 됩니다. 

A(1) - AA(2) - AAA(3) - AAAA(4)
                                                              - AAAAA(5) - AAAAE(6) - AAAAI(7) - AAAAO(8) - AAAAU(9)
                                         - AAAE (10)
                                         - AAAI (16)
                                         - AAAO (22)
                                         - AAAU (28)
                       - AAE (34)
                       - AAI (65)
                       - AAO (96)
                       - AAU (127)
         - AE (158)
         - AI (314)
         - AO (470)
         - AU (626)
E (782)

 위의 순서를 자세히 보면 다음의 규칙을 찾을 수 있습니다. 

- 5자리1씩 증가한다. 

- 4자리6씩 증가한다.

- 3자리31씩 증가한다.

- 2자리156씩 증가한다. 

- 1자리781씩 증가한다.  

 

 word의 길이는 최소 1이기 대문에 answer의 최솟값은 1입니다.

즉, answer의 최소값은 word의 길이가 될 수 있습니다.

 

 

- int solution(String word)

 word를 입력받고, 위에서 구한 규칙을 토대로 점화식을 구합니다. 

word 문자열에 존재하는 'A'는 사실상 word의 길이로 초기에 값을 구했다고 볼 수 있습니다.

 

 자릿수 별 증가하는 숫자는 따로 배열을 만들어서 저장해줬습니다. word 문자열의 길이와 자릿수는 일치하기 때문입니다.

 

 Map 자료구조를 이용하여 각 모음에 해당하는 값을 넣어줬습니다. 여기서 'A'에 0을 넣어줬습니다. 

예를 들어, 문자열 "AAEAA"의 길이는 5입니다. "AAAAA"에서 2번째 인덱스에 위치하는 A -> E로 가는 변화값만 더해준다면 "AAEAA"의 순서를 구할 수 있습니다. 즉, 순서를 구하기 위해 A를 0으로 지정해도 무방합니다. 

 

자릿수 별 저장되는 값은 다음과 같은 점화식으로 구할 수 있습니다. 

1번째 자리 : 781 X ( 0 ~ 4 ) == ( A ~ U)

2번째 자리 : 156 X ( 0 ~ 4 ) == ( A ~ U)

3번째 자리 : 31 X ( 0 ~ 4 ) == ( A ~ U)

4번째 자리 : 6 X ( 0 ~ 4 ) == ( A ~ U)

5번째 자리 : 1 X ( 0 ~ 4 ) == ( A ~ U)  

 

 

  코드
import java.util.HashMap;

public class BOJ_84512 {
	// PM / 84512번 / 위클리 챌린지 / 구현, 수학 / 5주차 
    public int solution(String word) {
    	// 문자열의 길이가 최소값이 된다. 
        int answer = word.length();
        // 길이별 증가되는 숫자 저장.
        int add[] = {781, 156, 31, 6, 1};
        // Map에 모음별 값 저장
        HashMap<Character, Integer> vowel = new HashMap<>();
        vowel.put('A', 0);
        vowel.put('E', 1);
        vowel.put('I', 2);
        vowel.put('O', 3);
        vowel.put('U', 4);
        // 구한 규칙과 점화식을 바탕으로 구현. 
        for(int i=0; i<word.length(); i++) {
        	char target = word.charAt(i);
        	int index = vowel.get(target);
        	answer += (add[i] * index);
        }
        return answer;
    }
}

 

 

 

피드백 환영합니다.

반응형