프로그래머스 2단계 - 모음사전 본문
2 단계 : 모음사전
코딩테스트 연습 > 완전탐색 > 모음사전
사전에 알파벳 모음 '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 |
입출력 예 설명
입출력 예 #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번째 단어입니다.
코드
function solution(word) {
const dictionary = []; // 사전
const target = ['A', 'E', 'I', 'O', 'U']; // 사전에 등록될 문자들
// 사전만들기
const makeDictionary = (level, member) => {
dictionary.push(member); // 맨처음 호출시 '' 들어갑니다.
// '' 빈문자열이고 레벨은 0이죠? 이때 for문 안에서는 어떤일이 일어날까요?
// makeDictionary(1, '' + ('A' ~ 'U')) 호출되겠죠? dictionary에 ['', A', 'E', 'I', 'O', 'U'] push
// 그다음엔 makeDictionary(2, ('A' ~ 'U') + ('A' ~ 'U')) 이런식으로 호출됩니다.
for(let i = 0; i < target.length; i++) {
if(level < target.length) {
// member는 어떻게 변하게 될까요? A만 붙는다고 쳤을 때
// '' (0) 'A' (1) 'AA' (2) 'AAA' (3) 'AAAA' (4) 'AAAAA'(5 => 최대레벨)
// makeDictionary(6, AAAAA + target[i]); 이렇게 호출되선 안되겠죠? 5일때 if문 안으로 들어오면 안됩니다.
makeDictionary(level + 1, member + target[i]);
}
}
}
makeDictionary(0, ''); // 사전제작
return dictionary.findIndex(item => item === word); // 몇번째 단어인지 검색하기
}
리뷰
순서는 다음과 같다
1. 사전과 사전을 만드는 함수 makeDictionary를 정의합니다.
2. 재귀적으로 구현할건데, 레벨을 하나씩 높여가면서 호출해줍니다. 레벨은 사전에 push될 멤버아이템의 length입니다.
3. 처음에 레벨이 0인 빈문자열로 함수를 호출해줍니다. 그렇다면 바로 빈문자열이 push됩니다.
4. ['A', 'E', 'I', 'O', 'U']를 순회하면서 다음 재귀를 호출하는데, makeDictionary(1, '' + ('A' ~ 'U')) dictionary에 ['', 'A', 'E', 'I', 'O', 'U'] 이런식으로 쌓입니다.
5. 이렇게 계속적으로 호출하면 'A' 일때 다음재귀에서 'AA' 'AE' 'AI' 'AO' 'AU' 가 member이고, level이 2인 상태로 재귀를 호출합니다.
6. 다음엔 예상되다시피 'AA' 일때는 'AAA', 'AAE' ... 이렇게 계속적으로 push되고 level을 올려서 호출합니다.
7. 재귀에는 재귀를 멈출 수 있는 조건이 필요하겠죠? 무작정 호출을 하는게아니라 타겟문자열의 길이만큼이 최대 사전의 멤버아이템이기 때문에 레벨이 5일때는 그다음 재귀를 호출하지 않습니다.
8. 모두 수행하고 사전에 순서대로 쌓였다면 solution 함수의 매개변수로 들어온 word가 몇번째 멤버아이템인지는 findIndex를 통해 찾아줍니다.
총평 : .
출처 : https://school.programmers.co.kr/learn/courses/30/lessons/84512
'알고리즘 > 2단계' 카테고리의 다른 글
프로그래머스 2단계 - 다리를 지나는 트럭 (2) | 2023.06.28 |
---|---|
프로그래머스 2단계 - 2 x n 타일링 (0) | 2023.06.25 |
프로그래머스 2단계 - 피로도 (3) | 2023.06.11 |
프로그래머스 2단계 - 연속 부분 수열 합의 개수 (0) | 2023.06.10 |
프로그래머스 2단계 - 땅따먹기 (2) | 2023.04.09 |