배열의 평균값을 구하기 위해서 가장 먼저 떠오르는 게 뭘까.
double solution(vector<int> v) {
int sum = 0;
int answer = 0;
for(int i = 0; i < v.size(); i++)
sum += v[i];
answer = sum / v.size();
return answer;
}
정석이라면 정석이다.
그런데 더 좋고 심플한 방법이 있으니...
reduce()
C++17에 추가된 std::reduce()
를 활용할 수 있겠다.
std::accumulate
와 유사하지만 병렬 처리를 지원한다는 점에서 조금 다르다.
사용은 다음과 같이 할 수 있다.
#include <iostream>
#include <vector>
#include <numeric> // std::reduce
#include <execution> // std::execution::seq
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
double sum = std::reduce(std::execution::seq, vec.begin(), vec.end(), 0.0);
double average = sum / vec.size();
std::cout << "Average: " << average << std::endl;
return 0;
}
std::execution::seq
는 정책을 나타내며 순차 연산을 수행한다.
병렬 처리를 원한다면 std::execution::par
를 사용할 수 있다.
정책은 따로 지정하지 않아도 된다.
그리고 가장 마지막 인수로 초기값을 준다. 위 예시에선 0.0을 줬다.
초기값을 지정하는 이유는 다음과 같다.
1. 초기값 지정
연산을 시작할 때의 기본 값을 설정한다.
예를 들어, 합계를 구할 때는 보통 0.0을, 곱셈을 할 때는 1을 초기값으로 설정한다.
2. 연산 유형 정의
초기값의 타입에 따라 연산의 결과 타입이 결정된다.
만약 초기값으로 0.0 (double)을 지정하면, 결과도 double 타입이 된다.
초기값으로 0 (int)을 지정하면, 결과도 int 타입이 된다.
따라서 정확한 계산을 위해 초기값의 타입을 적절히 설정하는 것이 중요.
3. 일관된 결과 보장
초기값을 지정함으로써 빈 컨테이너에 대해 연산을 수행할 때도 일관된 결과를 보장한다.
예를 들어, 빈 벡터의 합계를 구할 때 초기값이 0이면 결과는 0이 된다.
다시 돌아와서, 문제에 대한 답은 다음과 같이 낼 수 있다.
double solution(vector<int> v) {
double sum = reduce(v.begin(), v.end(), 0.0);
double answer = sum / v.size();
return answer;
}
모든 원소가 더해진 결과가 sum
에 저장되고, 그걸 벡터의 크기로 나눈다.
그럼 평균이 구해지기 때문에 그걸 리턴하면 완료.
포문을 돌며 처리할 수 있지만 이렇게 하는 편이 코드도 심플하고 가독성이 높아진다.
이런 것들을 잘 알아둘 필요가 있겠다.
'Camp > T.I.L.' 카테고리의 다른 글
[TIL #10] 자릿수 더하기 / 약수의 합 (0) | 2024.06.28 |
---|---|
[TIL #9] 홀짝 구분 (0) | 2024.06.27 |
[TIL #7] 짝수의 합 구하기 (0) | 2024.06.25 |
[TIL #6] Github Page로 웹페이지 배포 (0) | 2024.06.24 |
[WIL #1] 첫 주를 돌아보며 (0) | 2024.06.21 |