문제
머쓱이는 태어난 지 6개월 된 조카를 돌보고 있습니다.
조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음을 최대 한 번씩 사용해 조합한(이어 붙인) 발음밖에 하지 못합니다. 문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.
제한사항
1 ≤ babbling의 길이 ≤ 100
1 ≤ babbling[i]의 길이 ≤ 15
babbling의 각 문자열에서 "aya", "ye", "woo", "ma"는 각각 최대 한 번씩만 등장합니다.
즉, 각 문자열의 가능한 모든 부분 문자열 중에서 "aya", "ye", "woo", "ma"가 한 번씩만 등장합니다.
문자열은 알파벳 소문자로만 이루어져 있습니다.
풀이
이 말인 즉슨, aya", "ye", "woo", "ma"의 조합으로 만 이루어져 있는 단어가 몇개있는지 찾아라는 뜻인데.
처음에는 다음과 같은 단계를 거쳤다.
1. 합성어에 주어진 기본 단어가 포함되는가?
2. 포함 된다면 비교 배열에 push
3. 그리고 거기 있는 단어들을 더해서 합성와 비교, 같을시에 카운트 증가
하지만 이런식으로 진행하니 큰 문제가 생겼는데 바로,
단어 구성은 같아도 합성을 했을때 순서가 다를경우 전혀 다른 단어가 된다는 것이다.
해서 머리를 굴리다 다음과 같은 방안으로 수정했다.
1. 합성어에 주어진 기본 단어가 포함되는가?
2. 포함 된다면 비교 배열에 push
3. 비교 배열 반복문을 돌리면서 포함 단어들을 삭제한다.
4. 그렇게 해서 합성어의 갯수가 0이 된다면 오롯이 기본단어의 합성으로 구성된 합성어라는 뜻이 되므로
5. 카운트를 1개 증가 시킨다.
나같은 경우는 위와 같은 방법으로 했는데, 다 해결하고 문제 풀이를 보니
정규식으로 1줄로 끝내는 사람도 있더라.. 갑자기 현타가 밀려온다.
그래도 나같은 발상으로 푼 사람은 한명도 없어 보여서 나름 뿌듯하다.
소스코드
function solution(babbling) {
const baseWord = ["aya","ye","woo","ma"];
const includeWord = [];
let trueCnt = 0;
let clearWord = "";
//ex: ["ayaye", "uuuma", "ye", "yemawoo", "ayaa"]
//1. 합성어에 포함되는 단어들만 배열로 집합
//2. 합성어의 조합 순서를 바꿀순 없으니 속하는 단어들을 제거하는 형식으로 해보자.
//3. length가 0이되면 count1 증가로
babbling.forEach(str => {
baseWord.forEach(innerStr => {
str.includes(innerStr) ? includeWord.push(innerStr) : "";
})
clearWord = str;
for(let i = 0; i < includeWord.length; i++) {
//let idx = clearWord.indexOf(includeWord[i]);
//let removeWord = clearWord.substring(idx, idx + includeWord[i].length);
clearWord = clearWord.replace(includeWord[i], "");
}
if(clearWord.length === 0) {
trueCnt++;
}
if(includeWord.length > 0) {
includeWord.splice(0);
}
})
return trueCnt;
}