ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C++ 최소값과 최대값을 구하는 함수
    Knowledge/C++ 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

     

    반응형

    댓글

Designed by Tistory.