function solution(babbling) {
const can = ['aya','ye','woo','ma'];
let count = 0;
for(let i = 0; i < babbling.length; i++){
let babble = babbling[i];
for(let j = 0; j < can.length; j++){
if(babble.includes(can[j].repeat(2))){
break;
}
babble = babble.split(can[j]).join(" ");
}
if(babble.split(" ").join("").length === 0){
count += 1;
}
}
return count;
}
방법은 다음과 같다.
말할 수 있는 단어를 가지고 있는 배열 can
의 원소가 2번 이상 반복된다면 발음할 수 없으므로
break
를 통해 다음 단어로 넘어간다.
여기서 2번 이상 반복인데 왜 repeat(2)
로만 처리되는지 의문이 생길 수 있다.
아래 예시를 보자.
3번 반복되는 단어이다.
yeyeye
2번 이상 반복되는 순간부터는 무.조.건 2번은 반복된다.
...? 당연한 소리다.
아무튼, 2번 반복되는 것만 처리해도 2번 이상 반복되는 것까지 전부 처리할 수 있다는 뜻이다 :)
다음 코드로 넘어가자.
말할 수 있는 단어가 반복되지 않는다면, 배열 can
의 원소로 split()
을 진행한다.
그 후, join()
을 해주는데...여기서 아마 많은 분들이 헤매지 않았을까 감히 생각해본다.
그냥 join("")
을 해버리면, 단어가 재조합되면서 새로운 조건이 발생할 수도 있다.
아래 예시를 보자.
ayayyayae
위 단어는 배열 can
의 원소들을 기준으로 나누보면
aya + y + aya + e
로 볼 수 있겠다.
aya
를 지우고, 그냥 join("")
해버리면 어떻게 될까?
ye
이럴수가~! 새롭게 조합된 단어에 배열 can
의 원소에 속하는 문자열이 포함되어버린다.
이 상황을 막아주지 않으면 문제를 해결할 수 없다.
그래서 생각해낸 방법은 join("")
대신 join(" ")
을 하는 것이었다.
그냥 단순하게 알파벳 소문자가 아닌 문자열로 join()
을 하는 것이다.
그렇게 되면 위 예시는
y e
가 되어서, 배열 can
내에 있는 문자열과는 일치하지 않게된다!
이렇게, 배열 can
의 모든 문자에 대하여 연산을 마친 babble
은
필자의 방법 기준, 공백 문자(" ")로 나누어져 있으므로
공백 문자를 제거하여 다시 재조합해준다.
재조합한 문자의 길이가 0
이 아니라면 배열 can
내에 들어있는 원소 외의 다른 문자가 포함된 것이므로,
발음할 수 없는 단어이기 때문에 아무런 연산을 하지 않는다.
즉, 재조합한 문자열은 ""
이어야지 발음할 수 있는 것이므로
문자열의 길이가 0
이면 count
를 증가시킨다.
ㅈ나 천재인듯 메서드 활용한거와 행님의 외모에 감탄하고 갑니다