이 문제에서는 n개의 정수로 이루어진 배열 arr[]가 주어지며, C++을 사용해 배열 내 최솟값과 최댓값을 찾는 프로그램을 작성하는 것이 목표입니다.
문제 설명
n개의 정수 값을 담고 있는 배열 arr[]가 주어졌을 때, 배열에 포함된 모든 값 중에서 가장 큰 값(최댓값)과 가장 작은 값(최솟값)을 구해야 합니다.
예제로 문제 이해하기
입력
arr[] = {2, 1, 6, 9, 4, 10, 15, 21}출력
max = 21 , min = 1
해결 접근 방법
이 문제는 여러 가지 방법으로 해결할 수 있습니다. 가장 기본적인 방법은 배열의 요소들을 직접 비교하는 것입니다. 즉, 배열의 각 요소를 하나씩 확인하면서 비교 연산을 통해 최댓값과 최솟값을 찾는 방식입니다.
이러한 비교 방식은 다음 두 가지 접근법으로 구현할 수 있습니다.
- 반복문(Iterative) 접근법
- 재귀(Recursive) 접근법
방법 1: 반복문(Iterative) 접근법
배열 전체를 반복하면서 각 요소를 하나씩 추출하고, 현재까지의 최댓값과 최솟값과 비교하여 필요하다면 값을 갱신하는 방식입니다.
구현 예제 코드
#include <iostream>
using namespace std;
void getMinMax(int arr[], int N){
int max = arr[0], min = arr[0];
for(int i = 1; i < N; i++){
if(max < arr[i])
max = arr[i];
if(min > arr[i])
min = arr[i];
}
cout<<"Maximum Value = "<<max<<"\n";
cout<<"Minimum Value = "<<min;
}
int main(){
int arr[] = {2, 1, 6, 9, 4, 10, 15, 21};
int N = 8;
getMinMax(arr, N);
return 0;
}출력 결과
Maximum Value = 21 Minimum Value = 1
이 방식은 첫 번째 요소로 max와 min을 초기화한 뒤, 두 번째 요소부터 끝까지 순회하며 더 큰 값이 나오면 max를, 더 작은 값이 나오면 min을 갱신합니다. 시간 복잡도는 O(N)으로 효율적입니다.
방법 2: 재귀(Recursive) 접근법
이 방법은 함수가 자기 자신을 재귀적으로 호출하면서 배열의 모든 요소에 대해 최댓값과 최솟값을 단계적으로 계산하는 방식입니다.
구현 예제 코드
#include <iostream>
using namespace std;
int CalcMinValue(int arr[], int n) {
return (n == 1) ? arr[0] : min(arr[n - 1], CalcMinValue(arr, n - 1));
}
int CalcMaxValue(int arr[], int n) {
return (n == 1) ? arr[0] : max(arr[n - 1], CalcMaxValue(arr, n - 1));
}
int main() {
int arr[] = {2, 1, 6, 9, 4, 10, 15, 21};
int N = 8;
cout<<"Maximum Value = "<<CalcMaxValue(arr, N)<<endl;
cout<<"Minimum Value = "<<CalcMinValue(arr, N);
return 0;
}출력 결과
Maximum Value = 21 Minimum Value = 1
참고로 위 코드의 CalcMaxValue 함수에서 원래 CalcMinValue를 호출하던 부분은 버그이므로, 올바른 결과를 얻으려면 자기 자신인 CalcMaxValue를 재귀 호출하도록 수정해야 합니다.
방법 3: STL 표준 라이브러리 함수 활용
C++ 표준 템플릿 라이브러리(STL)에서 제공하는 내장 함수를 사용하면 훨씬 간결하게 문제를 해결할 수 있습니다.
최솟값과 최댓값을 찾는 데 사용되는 함수는 각각 min_element()와 max_element()이며, 이 함수들은 <algorithm> 헤더(또는 bits/stdc++.h)에 포함되어 있습니다. 이 함수들은 해당 범위 내 최댓값 또는 최솟값을 가리키는 반복자(iterator)를 반환하므로, 실제 값에 접근하려면 역참조 연산자(*)를 붙여야 합니다.
구현 예제 코드
#include <bits/stdc++.h>
using namespace std;
int main() {
int arr[] = {2, 1, 6, 9, 4, 10, 15, 21};
int N = 8;
cout<<"Maximum Value = "<<(*max_element(arr, arr+N))<<endl;
cout<<"Minimum Value = "<<(*min_element(arr, arr+N));
return 0;
}출력 결과
Maximum Value = 21 Minimum Value = 1
마무리
배열의 최솟값과 최댓값을 찾는 세 가지 방법을 살펴보았습니다. 학습 목적이라면 반복문이나 재귀 방식으로 로직을 직접 구현해 보는 것이 좋고, 실무에서는 간결하고 안정적인 STL의 min_element(), max_element() 함수를 활용하는 것을 추천합니다.