-
C++ 최소값과 최대값을 구하는 함수Knowledge/C++ 2019. 7. 16. 09:41반응형
BOJ 10818번 문제 ( https://www.acmicpc.net/problem/10818 ) 를 풀며 알게된 것
한번 삽질은 했지만 문제는 쉽게 풀었다. 이 포스팅거리는 그 이후 다른 분들의 코드를 보다가 얻은 건데
나는 둘 중 작은 수와 큰 수를 구하는 부분을
1234567891011121314151617181920212223242526272829303132333435#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 문과 부등호를 사용해 구현했는데
1234567891011121314151617181920212223242526272829303132#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()
이를 사용해 위의 문제를 해결한 코드는 아래와 같다
12345678910111213141516171819202122232425#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위시던데..ㅎㄷㄷ 나도 언젠가는 꼭!
참조 :
반응형'Knowledge > C++' 카테고리의 다른 글
C++ sizeof() 함수와 strlen()의 차이 (1) 2019.07.16 C++ 변수 여러개를 선언과 동시에 초기화 할 때 주의할 점 (0) 2019.07.16 C++ EOF 처리 방법 ( 백준 10951 A+B - 4 ) (6) 2019.07.11 문자열을 출력하고 줄을 바꿔주는 puts() 함수 (0) 2019.07.08 C++ 의 입력과 출력 ( cin / cout / scanf / printf ) (2) 2019.07.07