[프로그래머스] 옹알이(1).JS

ungnam·2023년 6월 7일

programmers level0

목록 보기
23/29
post-thumbnail

https://school.programmers.co.kr/learn/courses/30/lessons/120956

Lv0 문제임에도 불구하고 정답률 31% 를 자랑하는 악명높은 문제😨

나의 풀이

처음 시도한 풀이

function solution(babbling) {
    let count = 0;
    const words = ["aya", "ye", "woo", "ma"];
    
    babbling.forEach((v) => {
        words.forEach((word) => {
            while (v.includes(word)) {
                const regex = new RegExp(word, "g");
                v = v.replace(regex, "");
            }
        });
        if (!v.length) count++;
    })
    
    return count;
}

✔ 처음 생각했던 방식은 "그냥 babbling의 각 요소에 대해 더 이상 aya, ye, woo, ma가 존재하지 않을 때까지 계속해서 뽑아내면 되지 않나?" 였다.
replace()의 패턴 부분에 word를 전달하기 위해 RegExp 객체를 생성하여 전달 -> word에 해당되는 부분을 빈 값으로 치환
babbling[i]가 비어있다는 것은 모든 부분 문자열이 aya, ye, woo, ma로 이루어져있다는 것이므로 count를 1 증가시킴

❗ 그리고 코드 실행 후 이 풀이가 완전히 틀렸다는 것을 깨달았다...

무엇이 문제였을까?

babbling의 요소 중에 wyeoo가 있다고 생각해보자.
✔ 맨 처음 ye를 발견하고 뽑아냄
❗ 남은 문자열은 woo -> 그런데 woowords에 존재한다... 결국 woo도 뽑아낸 후 남은 문자열이 없어서 count가 증가된다.
❗ 실제로는 woo는 떨어져 있기 때문에 두 개가 결합되어서는 안 된다.

최종 풀이

function solution(babbling) {
    let count = 0;
    const words = ["aya", "ye", "woo", "ma"];

    babbling.forEach((v) => {
        words.forEach((word) => {
            while (v.includes(word)) {
                const regex = new RegExp(word, "g");
                v = v.replace(regex, " ");
            }
        });
        if (!v.trim().length) count++;
    })

    return count;
}

✔ 두 개가 결합이 되는 것을 방지하기 위해 replacement 부분을 "" 대신 " "으로 설정 => 이제 w oo가 되기 때문에 words 내의 요소에 포함되지 않게 된다.
✔ 요소가 조건에 맞으면 문자열이 공백으로만 이루어짐 -> trim()으로 공백을 제거

참고할 만한 풀이

function solution(babbling) {
  let count = 0;
  const regex = /^(aya|ye|woo|ma)+$/;

  babbling.forEach(word => {
    if (regex.test(word)) count++;  
  })

  return count;
}

/^(aya|ye|woo|ma)+$/ 부분이 문자열이 aye, ye, woo,ma로만 이루어져야 한다는 것을 의미한다고 하는데... 아직 정규표현식에 익숙하지 않아서인지 이해가 잘 되지 않는다.😓 정규표현식 지금부터라도 차근차근 공부해서 자유자재로 쓸 수 있도록 노력해야 겠다.

profile
꾸준함을 잃지 말자.

0개의 댓글