알고리즘

[1일 1 알고리즘] D+6 - 배열의 평균값

hyeeoooook 2026. 2. 21. 01:27

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

 

프로그래머스

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

programmers.co.kr


해결방법

function solution(numbers) {
    let answer = 0;
    for(let i = 0; i < numbers.length; i++){
        answer += numbers[i];
    }
    
    answer = answer/numbers.length;
    return answer;
}

사실 이렇게 for문을 이용하여 배열을 받아 각각 더해주면 쉽게 풀 수 있는 문제이다.

 

그렇다면 이렇게 시시한 문제를 왜 블로그에 기재하는가?

 

다른 사람이 푼 문제를 보았고, 이 방식이 새로워 공부하기 위해서 글로 남기기로 했다.

 

1. reduce 사용

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

reduce를 사용했다.

 

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce

 

Array.prototype.reduce() - JavaScript | MDN

 

developer.mozilla.org

reduce()
 메서드는 배열의 각 요소에 대해 주어진 리듀서 (reducer) 함수를 실행하고, 하나의 결괏값을 반환합니다.

 

즉, reduce()는 누산기이다. for은 단순 반복문이지만 문제와 같이 누적해서 계산을 해야하는 상황이라면 for 반복문보다 reduce() 함수를 이용하는 것이 조금 더 올바른 방향성이라고 생각했다.

 

 

기본 문법

arr.reduce(callback, initialValue)

 

여기서 callback 매개변수에는 다음과 같은 변수들을 갖는다.

(accumulator, currentValue, currentIndex, array)
// accumulator 누적값 (이전 반환값)
// currentValue 현재 요소
// currentIndex 현재 인덱스
// array 원본 배열

 

initialValue를 주지 않을 경우

[0,1,2,3,4].reduce((acc, cur) => acc + cur)

빈 배열일경우 에러가 발생한다.

 

 

initialValue를 주는 경우

[0,1,2,3,4].reduce((acc, cur) => acc + cur, 10)

빈 배열의 경우에도 에러가 발생하지 않는다.

 

initialValue이란?

초기값이다. 즉, 누적 계산을 하기 전에 시작 값을 주는 것이다.

위의 예제를 살펴본다면 initialValue를 주지 않은 예제의 경우 값은 0+1+2+3+4=10을 반환한다.

반면에 initialValue를 주는 예제의 경우 값은 10+0+1+2+3+4=20을 반환한다는 차이가 있다.

 


문제를 풀이한 사람들의 내용을 보면

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

 

numbers라는 임의의 배열값을 기본값 0부터 더하겠다는 의지가 명확하다.

그렇다면 어떤 경우로 사용할 수 있는지까지 알아보고자 한다.


나와랏 GPT!

1. 객체 배열 값 합산

[{x:1},{x:2},{x:3}]
.reduce((acc, cur) => acc + cur.x, 0)

 

2. 배열 평탄화

[[1,2],[3,4]]
.reduce((acc, cur) => acc.concat(cur), [])

 

3. 빈도수 세기(해시맵 패턴)

["a","b","a"]
.reduce((acc, cur) => {
  acc[cur] = (acc[cur] || 0) + 1;
  return acc;
}, {})

위 코드는 GPT에게 물어봤을 때 자주 쓰이는 방법들이다.

 


1번 코드

[{x:1},{x:2},{x:3}]
.reduce((acc, cur) => acc + cur.x, 0)

 

말 그대로 객체 배열일 경우 합산하는 방법이다.

위에서 다룬 코드를 객체의 형식으로 계산한 내용이다.

 


2번 코드

[[1,2],[3,4]]
.reduce((acc, cur) => acc.concat(cur), [])

배열 평탄화부터 조금 어려웠다.

concat()은 두 배열을 합쳐 다른 배열을 반환할 수 있는 코드이다.

 

사용법

배열.concat(다른배열)

 

값은 [1,2,3,4]가 될 것이다.


3번 코드

["a","b","a"]
.reduce((acc, cur) => {
  acc[cur] = (acc[cur] || 0) + 1;
  return acc;
}, {})

acc["a"] = 1

acc["b"] = 1

acc["a"] = 1+ 1

이 순서대로 진행되어 값은 { a:2, b:1 }을 반환한다.

 

객체로 만들어서 객체의 값을 더해주는 방식으로 했을 경우 배열에서 얼마나 많은 빈도로 등장하는지를 쉽게 비교해 볼 수 있다.