반응형

오랜만에 코딩 테스트 준비를 하면서 새로운 것들을 발견하게 되어 포스팅하게 됩니다. 

오랜만에 코딩 테스트 볼 일이 생겨서 프로그래머스에서 코딩 문제를 푸는데,

 

요즘엔 C++ 20까지 나온 상태다 보니, 굉장히 다양한 것들이 많이 생겼습니다.

 

그래서 막상 풀고 나서 분명 이거를 간단하게 사용하는 것이 이미 만들어져 있을 거야!라는 믿음으로 찾다 보니 발견하게 되었어요..


std::reduce <numeric>
  • std::reduce는 C++17에서 도입된 함수로, 컨테이너(예: std::vector)의 요소를 하나의 값으로 줄이는 데 사용
  • std::accumulate와 비슷하지만 병렬 처리를 지원할 수 있다는 점이 특징
  • 형식
T std::reduce(InputIt first, InputIt last, T init, BinaryOperation op);
  • 매개변수
    • first, last: 컨테이너의 시작과 끝을 가리키는 반복자
    • init: 초기값
    • op: 바이너리 연산 (두 요소를 줄이는 방법, 예: 더하기, 곱하기 등)
  • 병렬 처리
    • C++17 에서는 std::execution을 사용해 병렬 처리로 최적화할 수도 있습니다.
std::vector<int> numbers = { 1, 2, 3, 4, 5 };

int sum = std::reduce(execution::par,numbers.begin(), numbers.end(), 0);

cout << "합계: " << sum << endl;  // 출력: 10
return 0;

 

  • std::reduce vs std::accumulate
    특성 std::reduce std::accumulate
    병렬 처리 지원 가능 (std::execution) 불가능
    사용 가능 버전 C++17 이상 C++11 이상
    연산 순서 병렬 처리 시 순서가 보장되지 않음 연산 순서가 항상 왼쪽에서 오른쪽으로 진행
    성능 병렬 처리로 더 빠른 결과 가능 단일 스레드로 동작

std::lcm <numeric>
  • C++17에서 도입된 함수로, 두 수의 최소공배수(LCM)를 계산
#include <numeric>
#include <iostream>

using namespace std;

int main() {
    int a = 12, b = 18;

    // 최소공배수 계산
    int result = std::lcm(a, b);

    cout << "최소공배수: " << result << endl;  // 출력: 36
    return 0;
}

사실 간단한 함수 이기 때문에 이 부분에 대해 자세한 설명은 필요 없지만, 과연 어디서 활용될 수 있는가가 제일 중요한 거 아닐까요!! 

 

이 2개의 함수를 이용해서 최소 공배수 문제들을 풀 수 있습니다 !!

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

	answer = reduce(arr.begin(), arr.end(), arr[0], lcm<int, int>);
	return answer;
}

이 부분을 해석하면 arr 배열의 모든 원소를 처리하며 lcm을 적용하여 사용가능합니다.

 

즉, 최소 공배수 문제들을 이렇게 한 줄로 해결할 수 있다는 부분입니다.

C++ 최신 것들을 확인하다보니, 편한 함수들이 많이 생겨나고 있습니다. 너무나 좋은것..

반응형

+ Recent posts