C스타일의 배열이나 std::vector
, std::array
의 요소들 중에 최대 값을 찾거나 최소 값을 찾는 방법을 소개합니다.
1. 반복문으로 최소, 최대 값 찾기
가장 단순한 방법은 for 반복문으로 요소의 모든 값을 순회하면서 최소, 최대 값을 찾는 것입니다.
#include <iostream>
#include <climits>
int main() {
int arr[] = { 11, 42, -5, 9, -8, 34, 0 };
int min = INT_MAX;
int max = INT_MIN;
for (int i: arr)
{
if (i < min) {
min = i;
}
if (i > max) {
max = i;
}
}
std::cout << "min: " << min << std::endl;
std::cout << "max: " << max << std::endl;
return 0;
}
Output:
min: -8
max: 42
2. std::max_element()으로 최소, 최대 값 찾기
min_element(begin, end)
와 max_element(begin, end)
함수는 인자로 전달된 배열의 begin부터 end까지의 요소들 중에 최소, 최대 값을 찾습니다.
함수는 최대, 최소 값에 해당하는 객체 주소를 리턴하기 때문에, *
을 사용하여 value를 읽어야 합니다.
2.1 C스타일의 배열
C스타일 배열의 경우, begin은 배열의 시작 주소, end는 배열의 시작 주소에 배열 크기를 더하면 배열의 끝 주소가 됩니다. 이렇게 최대, 최소 값을 찾을 수 있습니다. 배열의 크기는 sizeof를 이용하여 계산할 수 있습니다.
#include <iostream>
#include <algorithm>
int main() {
int arr[] = { 11, 42, -5, 9, -8, 34, 0 };
int size = sizeof(arr) / sizeof(*arr);
int min = *std::min_element(arr, arr + size);
int max = *std::max_element(arr, arr + size);
std::cout << "min: " << min << std::endl;
std::cout << "max: " << max << std::endl;
return 0;
}
Output:
min: -8
max: 42
위의 예제에서는 배열의 마지막 요소의 주소 값을 계산할 때 sizeof를 사용하였는데 std::begin(arr)
과 std::end(arr)
를 사용하면 굳이 배열 크기를 직접 계산할 필요는 없습니다.
아래 코드의 실행 결과는 위와 동일합니다.
#include <iostream>
#include <algorithm>
int main() {
int arr[] = { 11, 42, -5, 9, -8, 34, 0 };
int min = *std::min_element(std::begin(arr), std::end(arr));
int max = *std::max_element(std::begin(arr), std::end(arr));
std::cout << "min: " << min << std::endl;
std::cout << "max: " << max << std::endl;
return 0;
}
2.2 std::vector
vector의 경우도 min_element(), max_element()의 사용 방법은 동일합니다. 대신 vector는 begin()
과 end()
함수를 제공하기 때문에 주소 값을 따로 계산할 필요는 없습니다.
#include <iostream>
#include <algorithm>
#include <vector>
int main() {
std::vector<int> arr = { 11, 42, -5, 9, -8, 34, 0 };
int min = *std::min_element(arr.begin(), arr.end());
int max = *std::max_element(arr.begin(), arr.end());
std::cout << "min: " << min << std::endl;
std::cout << "max: " << max << std::endl;
return 0;
}
Output:
min: -8
max: 42
2.3 std::array
std::array
의 경우도 사용 방법은 vector와 동일합니다.
#include <iostream>
#include <algorithm>
#include <array>
int main() {
std::array<int, 7> arr = { 11, 42, -5, 9, -8, 34, 0 };
int min = *std::min_element(arr.begin(), arr.end());
int max = *std::max_element(arr.begin(), arr.end());
std::cout << "min: " << min << std::endl;
std::cout << "max: " << max << std::endl;
return 0;
}
Output:
min: -8
max: 42
3. std::minmax_element()으로 최소, 최대 값 찾기
std::minmax_element(begin, end)
는 begin부터 end까지의 요소들 중에 최소, 최대 값을 찾아서 결과를 std::pair
로 리턴합니다.
리턴되는 값은 찾은 객체의 주소 값이기 때문에 *
으로 value를 읽어야 합니다.
3.1 C스타일의 배열
아래와 같이 최소, 최대 값을 찾을 수 있습니다. 리턴되는 pair의 first가 최소 값, second가 최대 값이 됩니다.
#include <iostream>
#include <algorithm>
int main() {
int arr[] = { 11, 42, -5, 9, -8, 34, 0 };
int size = sizeof(arr) / sizeof(*arr);
std::pair<int*, int*> minmax = std::minmax_element(std::begin(arr), std::end(arr));
std::cout << "min: " << *(minmax.first) << std::endl;
std::cout << "max: " << *(minmax.second) << std::endl;
return 0;
}
Output:
min: -8
max: 42
3.2 std::vector
vector도 배열과 동일한 방법으로 최대, 최소 값을 가져올 수 있습니다.
vector의 경우 리턴되는 std::pair<>
의 타입이 매우 긴데, 그냥 auto로 결과를 받을 수 있습니다.
#include <iostream>
#include <algorithm>
#include <vector>
int main() {
std::vector<int> arr = { 11, 42, -5, 9, -8, 34, 0 };
auto minmax = std::minmax_element(arr.begin(), arr.end());
// std::pair<std::vector<int>::iterator, std::vector<int>::iterator> minmax =
// std::minmax_element(arr.begin(), arr.end());
std::cout << "min: " << *(minmax.first) << std::endl;
std::cout << "max: " << *(minmax.second) << std::endl;
return 0;
}
Output:
min: -8
max: 42
3.3 std::array
std::array
의 경우도 사용 방법은 vector와 동일합니다.
#include <iostream>
#include <algorithm>
#include <array>
int main() {
std::array<int, 7> arr = { 11, 42, -5, 9, -8, 34, 0 };
auto minmax = std::minmax_element(arr.begin(), arr.end());
std::cout << "min: " << *(minmax.first) << std::endl;
std::cout << "max: " << *(minmax.second) << std::endl;
return 0;
}
Output:
min: -8
max: 42
Related Posts
- [C++] 배열을 리스트(list)로 변환
- [C++] 배열에서 특정 요소 제거
- [C++] vector 모든 요소의 합계 계산
- [C++] 두개의 배열이 같은지 비교
- [C++] 배열에 특정 요소가 있는지 확인
- [C++] 2차 배열 복사 방법
- [C++] 배열 복사하는 방법 (copy, memcpy)
- [C++] 함수의 인자로 배열 전달
- [C++] vector 모든 값의 평균 계산
- [C++] vector를 문자열로 변환
- [C++] 배열에서 요소의 Index 찾기
- [C++] 배열의 중복 요소 찾기
- [C++] 배열의 중복 요소 제거
- [C++] 배열 순서 거꾸로 뒤집기
- [C++] char 배열을 string으로 변환
- [C++] string을 char 배열로 변환
- [C++] 문자열 거꾸로 뒤집기
- [C++] vector의 중복 요소 제거
- [C++] 두 배열을 하나의 배열로 합치기
- [C++] 배열 길이, 크기 얻는 방법
- [C++] 배열에서 최대값, 최소값 찾기 (3가지 방법)
- [C++] int를 string으로 변환, 3가지 방법
- [C++] 문자열 리스트(Vector, 배열) 정렬
- [C++] string의 문자 정렬
- [C++] string을 int로 변환, 3가지 방법
- [C++] string 대문자/소문자 변환 방법
- [C++] string.compare() 문자열 비교
- [C++] int를 char로 변환, 3가지 방법
- [C++] 문자열 자르기, 3가지 방법
- [C++] isdigit(), 어떤 문자가 숫자인지 확인
- [C++] strlen(), 문자열 길이 계산
- [C++] strcmp(), strncmp() 함수로 문자열 비교
- [C++] strstr(), 특정 문자열 찾기