문제 : 정수를 담고 있는 배열 arr의 평균값을 return하는 함수, solution을 완성해보세요.

https://school.programmers.co.kr/learn/courses/30/lessons/12944

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


코드 1

function solution(arr){
    let sum = arr.reduce((acc, num) => {
        return acc + num;
    }, 0);
    return sum / arr.length;
}
  • reduce 를 사용해 배열의 모든 요소를 더해 sum 값을 만들었다.
  • 그 후, sum 배열의 길이로 나누어 평균을 반환하였다. 

코드 2 (흥미로웠던 코드)

function average(array){
  return array.reduce((a,b) => a+b) / array.length;
}
  • 나의 코드보다 더 간결하게 짜서 흥미로웠다.

< 궁금했던  점 (코드 2) >

"reduce에 초기값을 안주면 기본으로 초기값이 0인가?" 라는 의문이 들었다.

 

📝 reduce의 초기값 정리

    초기값을 주지 않았을 경우.

  • 배열이 비어있지 않다면 acc(누적값)는 자동으로 배열의 첫 번째 요소가 된다.
  • 그 다음 요소부터 reduce가 시작된다.

    예) [2, 3, 4,]

    초기값 없음 -> acc = 2, num = 3 부터 시작

 

이때 num이 두번째 요소가 되는 이유는?

reduce는 기본적으로 두 값을 합쳐 하나로 만들어 가는 함수인 초기값이 없을 경우 첫번째 요소를 초기값처럼 사용하고 두번째 요소부터 연산을 시작하는 구조이다. 

 

-> 그래서 위 풀이처럼 초기값을 생략해도 문제없이 잘 동작한다. 

 

하지만 배열이 비어있으면?

- 초기값이 없으면 에러 발생

- 초기값이 있으면 정상 동작

 

그래서 안전하게 코드를 작성하고 싶다면 웬만하면 초기값을 넣어주는 걸 추천한다. 


< 이번 문제를 통해 배운 점 >

1. reduce에서 초기값을 주지 않으면 배열의 첫 번째 요소가 누적값(acc)이 된다. 

2. 배열이 비어있는데 초기값이 없으면 에러가 발생한다.

3. 배열이 비어있지 않고 단순 합계를 구할때에는 초기값을 생략해도 동작하지만, 안전성을 생각하면 초기값을 명시하는 것이 더 안전한 코드다. 

+ Recent posts