[프로그래머스] 위클리 챌린지(5주차) - "모음 사전" (Java)
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;
}
}
피드백 환영합니다.
'문제 풀이 > Java' 카테고리의 다른 글
[프로그래머스] 위클리 챌린지(7주차) - "입실 퇴실" (Java) (0) | 2021.09.18 |
---|---|
[프로그래머스] 위클리 챌린지(6주차) - "복서 정렬하기" (Java) (0) | 2021.09.17 |
[프로그래머스] 위클리 챌린지(4주차) - "직업군 추천하기" (Java) (0) | 2021.09.13 |
[프로그래머스] 2020 KAKAO BLIND RECRUITMENT - "자물쇠와 열쇠" (Java) (0) | 2021.09.10 |
[프로그래머스] 2020 KAKAO BLIND RECRUITMENT - "문자열 압축" (Java) (0) | 2021.09.08 |
댓글
이 글 공유하기
다른 글
-
[프로그래머스] 위클리 챌린지(7주차) - "입실 퇴실" (Java)
[프로그래머스] 위클리 챌린지(7주차) - "입실 퇴실" (Java)
2021.09.18 -
[프로그래머스] 위클리 챌린지(6주차) - "복서 정렬하기" (Java)
[프로그래머스] 위클리 챌린지(6주차) - "복서 정렬하기" (Java)
2021.09.17 -
[프로그래머스] 위클리 챌린지(4주차) - "직업군 추천하기" (Java)
[프로그래머스] 위클리 챌린지(4주차) - "직업군 추천하기" (Java)
2021.09.13 -
[프로그래머스] 2020 KAKAO BLIND RECRUITMENT - "자물쇠와 열쇠" (Java)
[프로그래머스] 2020 KAKAO BLIND RECRUITMENT - "자물쇠와 열쇠" (Java)
2021.09.10