reduce 살펴보기

ijimlnosk·2024년 4월 14일
0
post-thumbnail
post-custom-banner

reduce 함수는 배열의 요소를 하나로 줄이는(reduce) 작업을 수행하는 함수이다.

reduce 함수로 배열의 각 요소를 순회하면서 누적된 값을 계산하고 최 종 결과를 반환한다.

reduce의 형태

array.reduce(callback, initialValue)
  • array: reduce를 적용할 배열
  • callback은 다음 네가지 인수를 받는다
    • accumulator : 누적값을 나타내며, 이전 callback 호출의 반환값이 여기에 저장된다. 첫번째 호출에서는 initialValue 가 있으면 그 값이, 없으면 배열의 첫번째 요소가 이 위치에 들어갑니다.
    • currentValue : 처리할 현재 배열 요소입니다.
    • currentIndex (선택사항) : 현재 요소의 배열 내 인덱스입니다.
    • array (선택사항) : reduce() 가 호출된 원본 배열입니다.

배열의 모든 요소를 합산하는 기본적인 예제

const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce((accumulator, currentValue) => accumulator + currentValue, 0);
console.log(sum) // 출력: 15

배열의 최대값 구하기

const numbers = [1, 2, 3, 4, 5];
const maxNum = numbers.reduce((acc, cur) => Math.max(acc, cur), -Infinity);
console.log(maxNum);
  • reduce() 함수 호출:
    • 콜백 함수: (acc, cur) => Math.max(acc,cur) 는 두 인자 acc (누적 값)와 cur (현재 값)을 받아서 둘 중 더 큰 값을 반환합니다.
    • 초기값: -Infinityacc 의 초기값으로 설정됩니다.
      이렇게 설정하는 이유는 어떤 수보다도 작기 때문에 배열의 첫 번째 요소부터 비교를 시작할 수 있도록 하기 위함이다
  • 처리과정:
    • 첫 번째 호출에서, accInfinity 이고, cur 는 배열의 첫 번째 요소인 1 입니다. Math.max(-Infinity, 1)1 을 반환합니다.
    • 두 번째 호출에서, acc 는 이제 1 이고, cur2 입니다.
      Math.max(1,2)2 를 반환합니다.
    • 이러한 과정이 배열의 끝까지 계속됩니다.

사용해보기

  • 프로그래머스 문제를 풀면서 사용을 해보았다

최대값 구하기 반대인 최소값을 구하는 문제를 먼저 풀어보았다

  • 제일 작은 수 제거하기
    const min = arr.reduce((acc, cur) => Math.min(acc, cur), Infinity);
    const filter = arr.filter((num) => num !== min);
    return filter.length === 0 ? [-1] : filter;};
  • reduce로 제일 작은 값을 구한 다음
  • filter를 사용하여 제일 작은 값을 뺀 나머지를 저장한다
  • 빈 배열일 경우 [-1]을 리턴한다
  • 약수의 개수와 덧셈
const solution1 = (left, right) => {
    return Array.from(
        // 새로운 배열 생성
        { length: right - left + 1 }, // 17 - 13 + 1
        (_, idx) => left + idx // 13부터 +idx만큼의 수
    ).reduce((acc, cur) => {
        const sqrt = Math.sqrt(cur); // 제곱근이 정수면 약수의 개수가 홀수이다
        return acc + (sqrt === Math.floor(sqrt) ? -cur : cur); // 제곱근이 정수면 결과에서 해당 숫자 빼기 아니면 더하기
    });
};
  • left 부터 right까지의 모든 수들 중에서
    약수의 개수가 짝수인 수는 더하고,
    약수의 개수가 홀수인 수는 뺀 수를 return하는 함수를 만들어야한다
  • 새로운 배열을 생성한 뒤 reduce를 사용하였다
    • cur을 제곱해주고 sqrt를 내림한 것을 비교한다.
  • 여기서 안 것은 제곱근이 정수면 약수의 개수가 홀수라는 것이다
  • 삼총사
const solution1 = (number) => {
    let result = 0;
    const freq = number.reduce((acc, cur) => {
        acc[cur] = (acc[cur] || 0) + 1;
        return acc;
    }, {});
    for (let i = 0; i < number.length; i++) {
        for (let j = i + 1; j < number.length; j++) {
            const sum = -number[i] - number[j];
            if (freq[sum]) {
                result += freq[sum] - (sum === number[i]) - (sum === number[j]);
            }
        }
    }
    return result / 3;
};

reduce를 사용하지 않고 for문을 세번 사용하여
동작 하게 할 수 있지만 reduce를 사용해보고 싶어서
써 봤다.

  • reduce를 사용하여 number의 각 요소의 빈도 수를 계산하여 freq객체에 저장했다
  • 중첩된 for문을 사용하여 각 요소에 대해, 다른 두 요소의 조합을 만들었다
  • 각 조합에 대해 -number[i] - number[j]를 계산하여 sum에 저장, 나머지 한 요소가 될 값을 나타낸다
  • freq[sum]이 존재하면, 해당 sum값이 배열에 있다는 것이고
  • sumnumber[i] 또는 number[j]와 같은 경우를 제외하고 freq[sum]에서 해당 빈도 수를 감소시킨다
  • 3번 카운트하기 때문에 result / 3을 한다.
post-custom-banner

0개의 댓글