
오늘의 알고리즘 코드카타는 '내적'에 관한 내용!
반복문 + 복합할당연산자를 활용하면 그리 어렵지 않겠다는 생각으로 후딱 풀었는데
세상에 ..! 다른 사람의 풀이를 찾아보다 누적값을 계산해주는 메소드가 있다는 걸 알게 됐다.
물론 그렇다고 내 풀이가 틀렸다는 것은 아니지만 이참에 하나씩 알아간다는 마인드로 공부해봤는데 사실 메소드 구성 요소가 많아서 그런지 이제까지 공부한 것중에 제일 복잡했다.😅 잘 모르겠으면 여러 번 보면 되지 뭐..
결정적으로 배열을 순회하면서 누적값을 계산하는 메소드 이름이 왜reduce인지가 이해가 안 간다😑 최강록도 아니구 배열을 졸인다는거야 뭐야
array.reduce(callback, initialValue)
callback : 배열의 각 요소에 대해 실행되는 함수로, 4개의 매개변수를 가질 수 있음accmulator (필수) : 이전까지 계산된 누적값을 저장currentValue (필수) : 현재 순회 중인 요소currentIndex (필수) : 현재 순회 중인 요소의 인덱스array (선택) : reduce 메소드가 호출될 배열initialValue (선택) : accmulator의 초기값. 생략 시 배열의 첫 번째 요소가 초기값으로 사용됨 reduce는 배열의 첫 번째 요소부터 마지막 요소까지 순회한다.callback 함수가 실행되고, accumulator에 새로운 값이 저장된다.accumulator 값이 반환된다.1. 배열의 합 계산
const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce((accumulator, currentValue) => {
return accumulator + currentValue;
}, 0);
console.log(sum); // 15
accumulator = 0accumulator = 0 + 1 = 1accumulator = 1 + 2 = 3accumulator = 3 + 3 = 6accumulator = 6 + 4 = 10accumulator = 10 + 5 = 15152. 배열의 곱 계산
const numbers = [1, 2, 3, 4];
const product = numbers.reduce((accumulator, currentValue) => {
return accumulator * currentValue;
}, 1);
console.log(product); // 24
accumulator = 1accumulator = 0 + 1 = 1accumulator = 1 + 2 = 3accumulator = 3 + 3 = 6accumulator = 6 + 4 = 10accumulator = 10 + 5 = 15153. 객체 배열에서 특정 값 추출
const items = [
{ name: "Apple", price: 100 },
{ name: "Banana", price: 200 },
{ name: "Cherry", price: 300 }
];
const totalPrice = items.reduce((accumulator, item) => {
return accumulator + item.price;
}, 0);
console.log(totalPrice); // 600
4. 중첩 배열 평탄화 (Flattening)
const nestedArray = [[1, 2], [3, 4], [5, 6]];
const flatArray = nestedArray.reduce((accumulator, currentValue) => {
return accumulator.concat(currentValue);
}, []);
console.log(flatArray); // [1, 2, 3, 4, 5, 6]
5. 초기값 없이 사용
const numbers = [1, 2, 3, 4];
const sum = numbers.reduce((accumulator, currentValue) => {
return accumulator + currentValue;
});
console.log(sum); // 10
accumulator는 배열의 첫 번째 요소로 초기화길이가 같은 두 1차원 정수 배열 a, b가 매개변수로 주어집니다. a와 b의 내적을 return 하도록 solution 함수를 완성해주세요.
이때, a와 b의 내적은 a[0]×b[0] + a[1]×b[1] + ... + a[n-1]×b[n-1] 입니다. (n은 a, b의 길이)
function solution(a, b) {
var answer = 0;
var arrayLength = a.length;
for (let i = 0; i < arrayLength; i++){
answer += a[i] * b[i];
}
return answer;
}
: 교과서적이면서 '근본 풀이'라고 불린다.
reduce() 를 활용한 풀이 function solution(a, b) {
return a.reduce((acc, _, i) => acc += a[i] * b[i], 0);
}
_의 의미
1. 사용되지 않는 변수
- javaScript에서 변수 이름으로
_를 사용하면 "이 변수는 필요 없어서 사용하지 않는다"는 의도를 나타낸다.- 이는 코드를 읽는 사람에게 "이 값은 무시해도 된다"고 알려주는 관례이다.
- 코드에서의 예시
return a.reduce((acc, _, i) => acc += a[i] * b[i], 0);
reduce콜백 함수의 두 번째 매개변수는 현재 배열 요소의 값- 여기서
_로 이름을 지정했지만 실제로는 이 값을 사용하지 않고 대신a[i]와b[i]를 사용
- 왜 무시했을까?
- 이 코드에서는 인덱스(
i)만 필요하고, 현재 배열 요소의 값은 사용하지 않기 때문!
reduce는 배열을 순회하면서 누적값을 생성하는 강력한 메소드이다. [].reduce((acc, val) => acc + val); // TypeError: Reduce of empty array with no initial valuereduce로 구현하면 가독성이 떨어질 수 있다. 간단한 작업에 적합한 메소드이다.
reduce()도 알게되고_도 알게되어 머리가 뽀글뽀글 어려운 하루..
그치만 새로운 걸 알아가는 일은 재미나요 ~
좋은 글이네요 화이팅입니다😇