사전캠프 6주차(7/4) TIL

slppills·2024년 7월 4일

TIL

목록 보기
22/69

코드카타 62번 - 옹알이(2)

문제 설명

머쓱이는 태어난 지 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() 함수를 사용하면 복잡한 반복문 없이 간단하게 풀 수 있었다.


Array.reduce()

: 배열의 각 요소에 대해 주어진 리듀서(reducer) 함수를 실행하고, 하나의 결과값을 반환한다.

- 기본 정리

arr.reduce(callback[, initialValue])
  • callback : 배열의 각 요소에 대해 실행할 함수. 다음 네 가지 인수를 가짐
    • accumulator : 누산기. 콜백의 반환값을 누적. 콜백의 이전 반환값 또는, 콜백의 첫 번째 호출이면서 initialValue를 제공한 경우에는 initialValue의 값임
    • currentValue : 처리할 현재 요소
    • currentIndex (Optional) : 처리할 현재 요소의 인덱스. initialValue를 제공한 경우 0, 아니면 1부터 시작
    • array (Optional) : reduce()를 호출한 배열

  • initialValue (Optional) : callback의 최초 호출에서 첫 번째 인수에 제공하는 값. 초기값을 제공하지 않으면 배열의 첫 번째 요소를 사용. 빈 배열에서 초기값 없이 reduce()를 호출하면 오류 발생


- 사용방법

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

1개의 댓글

comment-user-thumbnail
2024년 7월 5일

zz

답글 달기