
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 -> 그런데 woo도 words에 존재한다... 결국 woo도 뽑아낸 후 남은 문자열이 없어서 count가 증가된다.
❗ 실제로는 w와 oo는 떨어져 있기 때문에 두 개가 결합되어서는 안 된다.
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로만 이루어져야 한다는 것을 의미한다고 하는데... 아직 정규표현식에 익숙하지 않아서인지 이해가 잘 되지 않는다.😓 정규표현식 지금부터라도 차근차근 공부해서 자유자재로 쓸 수 있도록 노력해야 겠다.