Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ STL 완벽 활용법: 배열과 벡터의 합계·최댓값·최솟값 구하기 및 정렬

배열(Array)과 벡터(Vector)는 경쟁 프로그래밍에서 문제를 해결할 때 가장 널리 사용되는 핵심 자료구조입니다. C++의 STL(Standard Template Library, 표준 템플릿 라이브러리)은 이러한 배열과 벡터에 대한 다양한 연산을 손쉽게 처리할 수 있는 강력한 함수들을 제공합니다.

이 글에서는 STL에서 자주 사용되는 대표적인 함수들을 예제 코드와 실행 결과와 함께 자세히 살펴보겠습니다.

1. 배열/벡터의 합계, 최댓값, 최솟값 구하기

STL에는 배열이나 벡터의 합계, 최댓값, 최솟값을 구할 때 유용하게 쓰이는 함수들이 포함되어 있습니다. 각 함수의 원형은 다음과 같습니다.

합계 구하기

accumulate(startIterator, endIterator, initialSum)

지정된 범위의 모든 요소를 초기값(initialSum)에 순서대로 더한 결과를 반환합니다. 이 함수를 사용하려면 <numeric> 헤더가 필요합니다.

최댓값 구하기

*max_element(startIterator, endIterator)

범위 내에서 최댓값을 가진 요소의 반복자(iterator)를 반환하므로, 역참조 연산자(*)를 붙여 실제 값을 얻어야 합니다.

최솟값 구하기

*min_element(startIterator, endIterator)

마찬가지로 최솟값을 가진 요소의 반복자를 반환하며, 역참조하여 값을 사용합니다.

배열 연산 예제

#include <bits/stdc++.h>
using namespace std;

int main(){
    int arr[] = {65, 7, 12, 90, 31, 113};
    int l = sizeof(arr) / sizeof(arr[0]);

    cout << "배열의 요소 : ";
    for(int i = 0; i < l; i++)
        cout << arr[i] << "\t";
    cout << endl;

    cout << "배열 요소의 합계 : " << accumulate(arr, arr + l, 0) << endl;
    cout << "배열의 최댓값 : " << *max_element(arr, arr + l) << endl;
    cout << "배열의 최솟값 : " << *min_element(arr, arr + l) << endl;

    return 0;
}

실행 결과

배열의 요소 : 65	7	12	90	31	113
배열 요소의 합계 : 318
배열의 최댓값 : 113
배열의 최솟값 : 7

벡터 연산 예제

#include <bits/stdc++.h>
using namespace std;

int main(){
    vector<int> vec = {65, 7, 12, 90, 31, 113};

    cout << "벡터 요소의 합계 : " << accumulate(vec.begin(), vec.end(), 0) << endl;
    cout << "벡터의 최댓값 : " << *max_element(vec.begin(), vec.end()) << endl;
    cout << "벡터의 최솟값 : " << *min_element(vec.begin(), vec.end()) << endl;

    return 0;
}

실행 결과

벡터 요소의 합계 : 318
벡터의 최댓값 : 113
벡터의 최솟값 : 7

참고: 벡터의 경우 vec.begin()부터 vec.end()까지의 범위를 그대로 사용하면 됩니다. end()는 마지막 요소 다음 위치를 가리키는 반복자이므로, 이를 초과하는 범위를 지정하면 정의되지 않은 동작(undefined behavior)이 발생할 수 있으니 주의해야 합니다.

2. 배열/벡터 정렬하기

STL의 sort() 함수를 사용하면 배열이나 벡터의 요소를 오름차순으로 간단히 정렬할 수 있습니다. 이 함수는 퀵 정렬(Quick Sort)을 기반으로 하는 인트로소트(IntroSort) 방식으로 구현되어 있으며, 평균 시간 복잡도는 O(n log n)으로 매우 효율적입니다.

문법

sort(startIterator, endIterator)

배열 정렬 예제

#include <bits/stdc++.h>
using namespace std;

int main(){
    int arr[] = {65, 7, 12, 90, 31, 113};
    int l = sizeof(arr) / sizeof(arr[0]);

    cout << "정렬 전 배열 : ";
    for(int i = 0; i < l; i++)
        cout << arr[i] << "\t";
    cout << endl;

    sort(arr, arr + l);

    cout << "정렬 후 배열 : ";
    for(int i = 0; i < l; i++)
        cout << arr[i] << "\t";
    cout << endl;

    return 0;
}

실행 결과

정렬 전 배열 : 65	7	12	90	31	113
정렬 후 배열 : 7	12	31	65	90	113

벡터 정렬 예제

#include <bits/stdc++.h>
using namespace std;

int main(){
    vector<int> vec = {65, 7, 12, 90, 31, 113};

    cout << "정렬 전 벡터 : ";
    for(int i = 0; i < vec.size(); i++)
        cout << vec[i] << "\t";
    cout << endl;

    sort(vec.begin(), vec.end());

    cout << "정렬 후 벡터 : ";
    for(int i = 0; i < vec.size(); i++)
        cout << vec[i] << "\t";
    cout << endl;

    return 0;
}

실행 결과

정렬 전 벡터 : 65	7	12	90	31	113
정렬 후 벡터 : 7	12	31	65	90	113

마무리

STL의 accumulate, max_element, min_element, sort 함수를 활용하면 반복문을 직접 작성하지 않고도 배열과 벡터의 주요 연산을 간결하고 효율적으로 처리할 수 있습니다. 경쟁 프로그래밍이나 실무 개발에서 코드의 가독성과 생산성을 크게 높여주는 만큼, 각 함수의 동작 원리와 사용법을 잘 익혀두는 것이 좋습니다.