https://school.programmers.co.kr/learn/courses/30/lessons/84512
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
사전에 알파벳 모음 'A', 'E', 'I', 'O', 'U'만을 사용하여 만들 수 있는, 길이 5 이하의 모든 단어가 수록되어 있습니다. 사전에서 첫 번째 단어는 "A"이고, 그다음은 "AA"이며, 마지막 단어는 "UUUUU"입니다.
단어 하나 word가 매개변수로 주어질 때, 이 단어가 사전에서 몇 번째 단어인지 return 하도록 solution 함수를 완성해주세요.
제한 사항
- word의 길이는 1 이상 5 이하입니다.
- word는 알파벳 대문자 'A', 'E', 'I', 'O', 'U'로만 이루어져 있습니다.
입출력 예
word | result |
"AAAAE" | 6 |
"AAAE" | 10 |
"I" | 1563 |
"EIO" | 1189 |
해결 방법
직접 해결하지 못한 문제이다. 완전탐색 문제인데 일단 문제 자체가 잘 이해되지 않았던 것 같다. 고민하다가 풀이를 찾아보니 규칙을 찾아서 탐색하는 사람들도 있었고 재귀로 모든 단어를 탐색하는 사람도 있었다. 효율성으로 봤을 때 규칙을 이용하는 게 나을 것 같다고 생각해서 해당 방법을 이용했다.
문제를 먼저 이해해보자!
단어의 순서는
A, AA, AAA, AAAA, AAAAA, AAAAE, AAAAI, AAAAO, AAAAU ...이런 식으로 진행된다.
만약 A로 시작하는 모든 단어를 찾는다고 생각하면
A : 1글자인 경우 1 A _ : 2글자인 경우 5 ex) AA, AE, AI, AO, AU A _ _: 3글자인 경우 5^2 ex) AAA, AAE, ... , AEA, AEE .... , AIA, AIE, ... AOA.. AUU A _ _ _ : 4글자인 경우 5^3 A _ _ _ _ : 5글자인 경우 5^4 |
즉, 모음개수가 5개 이고 중복이 허용되기 때문에 5^(자릿수)의 경우의 수를 갖는다.
따라서 특정 알파벳으로 시작하는 단어의 위치를 찾는다고 할 때
1글자일 때 1
2글자 일 때 1 + 5
3글자 일 때 1 + 5 + 5^2
4글자 일 때 1 + 5 + 5^2 + 5^3
5글자 일 때 1 + 5 + 5^2 + 5^3 + 5^4
[781, 156, 31, 6, 1]이다.
모음의 순서는 = [A, E, I, O, U] 이고
만약 UIO 라는 글자의 위치를 찾고 싶다면 UIO_ _ 상태로 찾는다고 생각하면된다.
1. U _ _ _ _ 의 위치는 5글자이기 때문에 781 * 4(해당 모음의 인덱스) + 1
2. I _ _ _의 위치는 4글자 이기 때문에 156 * 2 + 1
3. O _ _의 위치는 3글자이기 때문에 31 * 3 + 1
해당 모음의 인덱스를 곱하는 이유는 해당 모음의 앞에 있는 모음 단어들의 개수를 더해야 하기 때문이고
+1을 하는 이유는 해당 모음으로 이동해야 하기 때문이다.
예를 들어, E로 시작하는 단어를 찾기 위해서는 A로 시작하는 단어가 앞에 위치해있기 때문에 781이고 여기서 1을 더해야 E로 시작하는 단어를 볼 수 있다.
따라서 문제 풀이 방법은
1. 각 모음을 key로 모음의 인덱스를 value로 하여 객체를 만든다.
2. 각 길이에 단어 개수를 배열로 저장한다.
3. 최종 계산 값을 저장한 answer 변수를 만든다.
4. 단어에 대해 반복문을 돌면서
-해당 글자에 대한 모음 인덱스를 변수에 저장한다.
-answer에 길이별 값 * 모음 인덱스 + 1을 한다.
5. answer를 리턴한다.
전체 코드
function solution(word) {
const alphabet = {'A': 0, 'E': 1, 'I': 2, 'O': 3, 'U': 4}
let sum = [781, 156, 31, 6, 1];
let answer = 0;
for(let i = 0; i<word.length; i++){
const val = alphabet[word[i]];
answer += val * sum[i] + 1
}
return answer;
}
참고 사이트
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[JavaSciprt] 프로그래머스 level1 #실패율 (0) | 2022.10.17 |
---|---|
[JavaScript] 프로그래머스 level1 #문자열 내 마음대로 정렬하기 (0) | 2022.10.11 |
[JavaScript] 프로그래머스 level1 #비밀지도 (0) | 2022.10.10 |
[JavaScript] 프로그래머스 level1 #시저암호 (0) | 2022.10.09 |
[JavaScript] 프로그래머스 level1 #예산 (0) | 2022.10.08 |