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);
(acc, cur) => Math.max(acc,cur)
는 두 인자 acc
(누적 값)와 cur
(현재 값)을 받아서 둘 중 더 큰 값을 반환합니다.-Infinity
는 acc
의 초기값으로 설정됩니다.acc
는 Infinity
이고, cur
는 배열의 첫 번째 요소인 1
입니다. Math.max(-Infinity, 1)
은 1
을 반환합니다.acc
는 이제 1
이고, cur
는 2
입니다.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
값이 배열에 있다는 것이고sum
이number[i]
또는number[j]
와 같은 경우를 제외하고freq[sum]
에서 해당 빈도 수를 감소시킨다- 3번 카운트하기 때문에 result / 3을 한다.