[JS] 프로그래머스 Lv1 - 옹알이 (2)

찐새·2023년 5월 25일
0

코딩테스트

목록 보기
53/53
post-thumbnail

옹알이 (2)

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을 해당 인덱스로 치환하고, 같은 인덱스가 붙어 있거나 숫자가 아닐 경우 flagfalse로 변경해 세지 않았다.

배운점

주어진 제한사항이 크지 않으니 이 조잡한 코드가 무사히 돌아간 것이지, 아니었다면 아직도 헤매고 있었을 것이다. 정규식을 더 잘 알았다면 더 쉽게 풀었을 것 같다.

그러한 점을 배울 수 있는 정답 코드가 있어 가져왔다.

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에서 설명을 보니 가장 최근에 캡쳐링한 텍스트와 일치하는 것을 반환하는 것이었다. ayayeyeye가 캡처링되고 난 직후 그것과 같은 ye가 캡처링 되므로 true를 반환한다. 정답 조건에 맞지 않으므로 패스한다.

profile
프론트엔드 개발자가 되고 싶다

0개의 댓글