Knowledge/C++

C++ 최소값과 최대값을 구하는 함수

TakeKnowledge 2019. 7. 16. 09:41
반응형

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위시던데..ㅎㄷㄷ 나도 언젠가는 꼭! 

 

참조 : 

 

[C++ 강좌] 092 - 알고리즘 헤더 파일 (1) - max(), min()

안녕하세요. 사실 이번 주제는 원래는 쓸 계획이 없었는데,C++에서 지원하는 굉장히 편리한 기능이기도 하...

blog.naver.com

 

[C++ 강좌] 093 - 알고리즘 헤더 파일 (2) - max_element(), min_element()

저번 글에서 두 개의 값 중 최대, 최소값을 찾는 함수를 알려드렸는데...비슷한 역할을 하면서 사용법이 다...

blog.naver.com

 

반응형