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