이현구의 공부방

[C/C++] accumlate 평균 구하기 본문

C++를 해보자/기본기

[C/C++] accumlate 평균 구하기

이현구 2023. 3. 5. 22:17

대개는 int형 배열 값들의 평균 구하는 부분에서 보통은 아래와 같은 코드로 반복문을 사용하여

배열의 값들을 합해준 뒤에 배열의 size만큼 나누어 평균을 구하게 된다.

#include <vector>

double solution(vector<int> arr) {
	double answer = 0;

	int size = arr.size();
	double sum = 0;

	for (int i = 0; i < size; i++)
	{
		sum += arr[i];
	}

	answer = sum / size;

return answer;
}

 

하지만 accumlate를 쓰게 된다면 간단하게 배열의 합을 구할 수 있습니다.

#include <string>
#include <vector>
#include <numeric>
using namespace std;

double solution(vector<int> arr) {
    double answer = accumulate(arr.begin(), arr.end(), 0);    // accumulate 가 뭐지 ?

    return answer / arr.size();
}

std::accumulate 함수는 <numeric> 헤더에 정의되어 있으며, 범위 내 요소들의 합을 반환합니다.

첫 번째 인자로는 범위의 시작 지점을,

두 번째 인자로는 범위의 끝 지점을,

세 번째 인자로는 합산을 시작할 값(초기값)을 받습니다.

범위 내의 요소들은 모두 더해져 최종 값을 반환합니다.

예를 들어, std::accumulate(vec.begin(), vec.end(), 0)는 vec 벡터의 모든 요소를 더한 값을 반환합니다.

이 함수는 일반적으로 반복자를 사용하는 STL 알고리즘과 함께 사용됩니다.

 

 

주의가 필요한 사항은 세 번째 인자인 초기값입니다.

template< class InputIt, class T >
constexpr T accumulate( InputIt first, InputIt last, T init );

함수의 원형을 보게 된다면 세 번째 인자 값으로 들어온 타입이 반환되는 것을 확인할 수 있는데요.

예를 들어 int size를 초과하는 합산 결과가 발생한다면 오버플로우가 발생하게 됩니다.

 

때문에 아래와 같이 상황에 맞게 초기값을 세팅해주어야 합니다.

 

  • U : unsigned 정수 타입을 나타냅니다. 예를 들어, 10U는 unsigned int 타입의 10을 나타냅니다.
  • L : long 정수 타입을 나타냅니다. 예를 들어, 10L은 long 타입의 10을 나타냅니다.
  • LL : long long 정수 타입을 나타냅니다. 예를 들어, 10LL은 long long 타입의 10을 나타냅니다.
  • F : float 실수 타입을 나타냅니다. 예를 들어, 3.14F는 float 타입의 3.14를 나타냅니다.
  • D : double 실수 타입을 나타냅니다. 예를 들어, 3.14D는 double 타입의 3.14를 나타냅니다.
  • L : long double 실수 타입을 나타냅니다. 예를 들어, 3.14L은 long double 타입의 3.14를 나타냅니다.
Comments