C++ 최소값과 최대값을 구하는 함수
BOJ 10818번 문제 ( https://www.acmicpc.net/problem/10818 ) 를 풀며 알게된 것
한번 삽질은 했지만 문제는 쉽게 풀었다. 이 포스팅거리는 그 이후 다른 분들의 코드를 보다가 얻은 건데
나는 둘 중 작은 수와 큰 수를 구하는 부분을
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
#include <stdio.h>
int main(void)
{
int n, input, min, max;
//배열크기,입력값,최소값,최대값
scanf("%d",&n);
int arr[n];
// n만큼 배열 생성
for(int i=0; i<n;i++){
scanf("%d",&input);
arr[i] = input;
}
// input 변수 활용해 입력 값 배열에 각각 저장
min=arr[0];
max=arr[0];
// 배열 첫번째 값을 최소 최대값으로 설정
for(int i=0; i<n;i++){
if(min>arr[i]){
min = arr[i];
}
// 최소값과 비교해 더 작으면 최소값에
if(max<arr[i]){
max = arr[i];
}
// 최대값과 비교해 더 크면 최대값에 저장
}
printf("%d %d",min,max);
// 배열 모두 검사하고 최소값 최대값 출력
}
|
cs |
이렇게 if 문과 부등호를 사용해 구현했는데
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
#include <stdio.h>
#include <algorithm>
using namespace std;
int main(void)
{
int n, input, minVal, maxVal;
//배열크기,입력값,최소값,최대값
scanf("%d",&n);
int arr[n];
// n만큼 배열 생성
for(int i=0; i<n;i++){
scanf("%d",&input);
arr[i] = input;
}
// input 변수 활용해 입력 값 배열에 각각 저장
minVal=arr[0];
maxVal=arr[0];
// 배열 첫번째 값을 최소 최대값으로 설정
for(int i=0; i<n;i++){
minVal = min(minVal,arr[i]);
// 최소값과 비교해 더 작으면 최소값에
maxVal = max(maxVal,arr[i]);
// 최대값과 비교해 더 크면 최대값에 저장
}
printf("%d %d",minVal,maxVal);
// 배열 모두 검사하고 최소값 최대값 출력
}
|
cs |
위와 같이 바로 최소값과 최대값을 리턴해주는 함수 min()과 max()를 사용해 구현한 코드를 보게 된 것
이 함수를 사용하기 위해선 3가지 유의할 점이 있는데
1. 이 함수는 algorithm 헤더 파일에 들어있기 때문에 #include <algorithm>을 선언해줘야 한다
2. using namespace std;를 선언해줘야 한다. 아니면 std::min() 처럼 사용해야 하는 듯
3. 함수명과 같은 변수 (ex: min, max)를 같이 사용해선 안된다. (그래서 발생한 에러 직접 경험 또르르..ㅜㅜㅋ)
위 3가지만 지켜주면 파라미터로 넣은 두 수 중 작고 큰 값을 함수 한방에 알아낼 수 있다.
근데 사실 이건 뭐 if문으로 구현할 수도 있고.. 좀 약하다싶어
배열에서 바로 최소값이나 최대값을 찾아주는 함수는 없나 찾아보니 있었다.
바로 max_element()와 min_element()
이를 사용해 위의 문제를 해결한 코드는 아래와 같다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
#include <stdio.h>
#include <algorithm>
using namespace std;
int main(void)
{
int n, input, minVal, maxVal;
//배열크기,입력값,최소값,최대값
scanf("%d",&n);
int *arr = new int[n];
// n만큼 배열 생성
for(int i=0; i<n;i++){
scanf("%d",&input);
arr[i] = input;
}
// input 변수 활용해 입력 값 배열에 각각 저장
minVal = *min_element(arr,arr+n);
maxVal = *max_element(arr,arr+n);
printf("%d %d",minVal,maxVal);
// 배열 모두 검사하고 최소값 최대값 출력
}
|
cs |
대충 봐도 코드가 매우 짧아졌음을 알 수 있다. 대신 유의할 점이 있는데
1. 이 역시 algorithm 헤더에 있는 함수라 #include <algorithm>을 반드시 선언해줘야 한다.
2. max(), min()과 동일하게 using namespace std;도 선언해줘야한다.
3. 가장 중요한 점인데 이 함수는 값을 리턴하지 않고 주소값을 반환해준다!
따라서 값을 참조하려면 * 연산자를 반드시 사용해줘야 한다!
위 점들만 지켜주면 유용한 함수를 편하게 사용할 수 있다.
그리고 이런 것들을 알게 되면서, 나는 JAVA를 할 수 있으니 C++은 간단히 문제 풀면서 익히면 되겠지 했던 생각이 완전 바뀌어서 아주 심도깊게 익히진 못하겠지만 C와 C++을 전체적으로 한번 제대로 훑어보는 쪽으로 방향을 틀었다. 나중에 복잡한 데 가서 헤매느니 지금 좀 시간이 걸리더라도 제대로 배우고 가는 게 맞는거 같아서. 마침 포스팅한 정보를 먼저 포스팅해주신 블로그 주인장께서 텍스트로 C와 C++ 강의를 해주신 게 있어서 요즘은 그걸 찬찬히 따라가보고 있다. 보니까 백준 랭킹 20위시던데..ㅎㄷㄷ 나도 언젠가는 꼭!
참조 :