문제 해석
aya, ye, woo, ma 네가지 단어로만 구성된 배열의 요소를 찾아내라.
단, 네가지 단어 중 연속되어 반복되는 것이 포함되어있으면 안된다. ex) ayaaya / yeye/ woowoo / mama
해당 조건을 만족하는 요소의 개수를 리턴하라
문제를 처음 이해하고 생각난 것은 네가지 문제를 포함하는 것을 판단한느 정규식이었다.
하지만 정규식 사용에 익숙하지 않아 포기하였고, 반복문을 사용하여 판별하려 하였다.
처음 작성한 코드
function solution(babbling) {
var answer = 0;
let arr = ['aya', 'ye', 'woo', 'ma']
for (let i = 0; i<babbling.length; i++) {
let temp = babbling[i]
for (let j = 0; j<arr.length; j++) {
if (temp.includes(arr[j].repeat(2))) {
break;
}
temp = temp.split(arr[j]).join(' ')
}
if (temp.trim().length === 0) {
answer++
}
}
return answer;
}
발음할 수 있는 단어들을 모아둔 arr 배열을 만들어주었다.
반복문을 사용하여 인자인 babbling 각 요소에 대해 판별할 수 있게 하였고, 중첩반복문을 사용하여 각 요소마다 발음가능한 단어의 최소반복(2회)가 포함되어있는지 먼저 판별하였다.
만약 포함되어있다면 해당 babbling요소는 break되어 넘어간다.
또한, 길이가 0이 아니므로 조건문도 통과하지 못하여 처음 반복문이 다음으로 넘어가게 된다.
만약 단어반복사용에 대한 검사가 각각 이루어 진다고 가정해보자.
'ayayewoomaaya'라는 단어가 들어왔을 때, 연속되어 사용된 단어가 없으므로
aya를 기준으로 split하여 [ye, woo, ma] 배열이 만들어지고 띄어쓰기를 넣어 join한다.
'ye woo ma'가 다음 ye에 대한 평가를 받고, 또 split, join되어 ' woo ma'가 될 것이다.
반복하면 결국 띄어쓰기만 남게되는데 이 때 단어반복사용반복문이 끝나면 조건문이 실행된다.
여기서 trim을 이용하여 양 끝 띄어쓰기를 없애주고 그 길이가 0이라면 문제의 조건을 잘 이행한 것이므로 answer에 1을 더한다.
다른사람의 풀이(정규식)
function solution(babbling) {
const regexp1 = /(aya|ye|woo|ma)\1+/;
const regexp2 = /^(aya|ye|woo|ma)+$/;
return babbling.reduce((ans, word) => (
!regexp1.test(word) && regexp2.test(word) ? ++ans : ans
), 0);
}
정규식 작성을 이해하기가 어렵다.
대충 생각해본다면, regexp1은 aya, ye, woo, ma 각 단어 중 한번이라도 사용되었는지 판별하는 것 같다.
regexp2는 모르겠다.
정규식에 대한 공부가 필요할 것으로 보인다.
https://velog.io/@purplew/Javascript-%EC%A0%95%EA%B7%9C%ED%91%9C%ED%98%84%EC%8B%9D
https://regexper.com/#%2F%28aya%7Cye%7Cwoo%7Cma%29%5C1%2B%2F
https://ko.javascript.info/regexp-anchors