https://school.programmers.co.kr/learn/courses/30/lessons/133499
function solution(babbling) {
const able = ["aya","ye","woo","ma"];
let cnt = 0;
for (const v of babbling) {
let word = v, flag = true;
able.forEach((x, i)=>{
word = word.replaceAll(x, `${i}`);
});
[...word].forEach((z, i)=>{
if (z === word[i+1] || !Number.isInteger(+z)){
flag = false;
}
})
if (flag) cnt++;
}
return cnt;
}
able
에 포함된 babblig
을 해당 인덱스로 치환하고, 같은 인덱스가 붙어 있거나 숫자가 아닐 경우 flag
를 false
로 변경해 세지 않았다.
주어진 제한사항이 크지 않으니 이 조잡한 코드가 무사히 돌아간 것이지, 아니었다면 아직도 헤매고 있었을 것이다. 정규식을 더 잘 알았다면 더 쉽게 풀었을 것 같다.
그러한 점을 배울 수 있는 정답 코드가 있어 가져왔다.
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
에서 \1
은 처음 보는 표현이었는데, regex101에서 설명을 보니 가장 최근에 캡쳐링한 텍스트와 일치하는 것을 반환
하는 것이었다. ayayeye
는 ye
가 캡처링되고 난 직후 그것과 같은 ye
가 캡처링 되므로 true
를 반환한다. 정답 조건에 맞지 않으므로 패스한다.