[JS] 배열의 평균값 programmers reduce, forEach

0

코딩테스트

목록 보기
14/80
post-thumbnail

🎀 문제

정수 배열 numbers가 매개변수로 주어집니다. numbers의 원소의 평균값을 return하도록 solution 함수를 완성해주세요.

function solution(numbers) {
    var answer = 0;
    return answer;
}

🎀 내 답변

📌 처음 답변

평균을 구하려면 배열 속 모든 숫자를 더한 후 배열의 길이 만큼 나눠주면 된다.

function solution(numbers) {
    var answer = 0;
	for(let i = 1; i <= numbers; i++){
    	answer += i
    }
    console.log(answer / numbers);
}

solution(10); // 배열이 들어와야함

이렇게 작성해도 동작은 한다.
하지만 numbers에는 배열이 들어오는데, 단일 숫자가 들어오는걸로 착각하여 잘못 작성했다.

📌 최종 답변

function solution(numbers) {
    var answer = 0;
    numbers.forEach( (item) => {
        answer += item;
    });
    return answer / numbers.length;
}

solution([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);

👉🏻 forEach문을 쓴 이유?

배열로 받아온 숫자들은 모두 object 객체로 넘어오게 된다.
console.log(typeof numbers)를 찍어보면

라고 찍힌 것을 확인할 수 있고 해결하기 위해서 forEach문을 썼다.

👉🏻 reduce도 사용 가능하다

  • reduce는 줄인다는 뜻으로, 누산기와 같다
  • 두 개의 인자를 가진다.
    acc (accumulator) : 누산기, 누적되는 값, 최종적으로 출력되는 값
    cur (current) : 현재 돌고 있는 요소
// 1에다가 나머지 2~10을 순차적으로 돌면서 더해주게 된다.

const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let sum = numbers.reduce((acc, cur) => acc + cur)

// return 55

acc에는 가장 첫번째 인자인 1이 들어가고, cur에는 2 부터 숫자가 순서대로 들어오게 된다.

  • initialValue : acc의 초기값 (optional)

여기에 initialValue를 추가하면 작동법이 더 쉬워진다.

//1이 아니라 지정해준 0 에다가 1 ~ 10 까지의 숫자를 더해준 값이 return 된다 

const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let sum = numbers.reduce((acc, cur) => acc + cur, 0)

// return 55

acc의 초기값은 배열의 0번째 요소로 자동 지정되는데, initialValue로 우리가 원하는 초기 값을 설정해 주는 것이다.

개인적으로 이렇게 해주면 코드가 더 직관적이게 보이는 것 같다.
하지만 초기값이 각 배열마다 달라야하는 상황에서는 오히려 독일지도...?

아무튼 reduce를 사용한 답변은 아래와 같다.

function solution(numbers) {
    var answer = 0;
    answer = numbers.reduce((acc,curr) => acc + curr) / numbers.length
    return answer
}

profile
일단 해. 그리고 잘 되면 잘 된 거, 잘 못되면 그냥 해본 거!

0개의 댓글