머쓱이는 태어난 지 11개월 된 조카를 돌보고 있습니다. 조카는 아직 "aya", "ye", "woo", "ma" 네 가지 발음과 네 가지 발음을 조합해서 만들 수 있는 발음밖에 하지 못하고 연속해서 같은 발음을 하는 것을 어려워합니다. 문자열 배열 babbling이 매개변수로 주어질 때, 머쓱이의 조카가 발음할 수 있는 단어의 개수를 return하도록 solution 함수를 완성해주세요.
function solution(babbling) {
let answer = 0;
// babbling 길이만큼 반복
for (let i=0; i<babbling.length; i++) {
if (babbling[i] === "aya" || babbling[i] === "ye" || babbling[i] === "woo" || babbling[i] === "ma") {
// babbling의 각 요소의 값이 옹알이 발음 하나만 있으면 answer에 1 추가
answer++;
} else {
// break 나올 때까지 반복
while (true) {
if (babbling[i].substr(0, 3) === "aya") {
if (babbling[i].substr(3, 3) !== "aya") {
babbling[i] = babbling[i].substr(3);
// 같은 발음의 옹알이가 붙어있으면 break
} else break;
} else if (babbling[i].substr(0, 2) === "ye") {
if (babbling[i].substr(2, 2) !== "ye") {
babbling[i] = babbling[i].substr(2);
} else break;
} else if (babbling[i].substr(0, 3) === "woo") {
if (babbling[i].substr(3, 3) !== "woo") {
babbling[i] = babbling[i].substr(3);
} else break;
} else if (babbling[i].substr(0, 2) === "ma") {
if (babbling[i].substr(2, 2) !== "ma") {
babbling[i] = babbling[i].substr(2);
} else break;
} else break;
}
if (babbling[i] === "") {
answer++;
}
}
}
return answer;
}
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);
}
정규표현식과 reduce() 함수를 사용하면 복잡한 반복문 없이 간단하게 풀 수 있었다.
: 배열의 각 요소에 대해 주어진 리듀서(reducer) 함수를 실행하고, 하나의 결과값을 반환한다.
arr.reduce(callback[, initialValue])
reduce()함수에는 누산기가 포함되어 있기 때문에, 배열의 각 요소에 대해 함수를 실행하고 누적된 값을 출력할 때 용이하다.
const arr = [1, 2, 3, 4, 5];
const result = arr.reduce((acc, cur, idx) => { return acc += cur; }, 0);
console.log(result); // 15
const arr2 = [1, 2, 3, 4, 5];
const result2 = arr2.reduce((acc, cur, idx) => { return acc += cur; }, 10);
console.log(result2); // 25
이 예시들은 모든 배열의 합을 구하는 reduce()함수의 가장 기본적인 예시들이다.
result는 initialValue의 값을 0으로 두었기 때문에 0+1+2+3+4+5 = 15가 되고, result2는 initialValue의 값이 10이기 때문에 10+1+2+3+4+5 = 25가 된다.
initialValue에는 배열이 들어갈 수도 있다.
다음 코드는 배열에서 음수와 양수의 개수를 카운트하는 코드이다.
const numbers = [2, -5, -123, 59, -5480, 24, 0, -69, 349, 3];
const result = numbers.reduce((acc, cur, idx) => {
if(cur < 0){
// 처리할 현재 요소가 음수일 경우
acc[0]++;
}
else if(cur > 0){
// 처리할 현재 요소가 양수일 경우
acc[1]++;
}
return acc;
}, [0,0]);
console.log(result); // [4, 5]
위의 코드에서는 numbers 배열 요소에서 각각의 양수와 음수를 카운트하기 위해 initialValue를 [0, 0]으로 설정했다. 첫 번째 호출 시, acc의 값은 initialValue의 값으로 설정되므로 초기 acc 값은 [0,0]이다. 그리고 numbers 배열을 돌면서 양수와 음수를 acc의 0번째 인덱스와 1번째 인덱스에 카운트를 한다.
참고한 블로그 : https://miiingo.tistory.com/365
zz