본문 바로가기
7장 기타/백준 BOJ

[백준/BOJ] 10818번 최소, 최대 (C++)

2021. 5. 4.
 

10818번: 최소, 최대

첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.

www.acmicpc.net

문제의 소재

N개의 정수가 주어졌을 때, 최솟값과 최댓값을 출력하는 문제이다.

해답

전처리기 #define을 활용하였다. MAX(A,B), MIN(A,B)를 정의하여 두 수를 손쉽게 비교할 수 있었다. 처음 입력되는 수를 최댓값 max와 최솟값 min에 대입하고 수가 입력될 때 마다. 크기 판단을 하여 min, max를 구할 수 있었다.

 

#define MAX(A,B) (A>B ? A:B)는 전처리기로 컴파일러가 컴파일시 MAX(A,B)로 기재된 부분을 (A>B ? A:B)로 바꾸어준다. A>B ? A:B에서 ? 연산자는 앞에 적힌 변수(int형 변수는 0일 때 false, 0보다 크면 true로 변환된다.)나 수식이 true값일 경우 A를 출력하고 false이면 B를 출력한다. 마찬가지로 #define MIN(A,B) (A<B ? A:B)로 최솟값을 정의할 수 있다.

 

전처리기를 사용하면 코드를 그대로 치환한다. 띄어쓰기가 없거나, 연산자의 우선순위에 따라 결과가 다른 경우 예상하지 못한 결과가 나올 수 있다. 따라서 괄호를 같이 사용해주는 것이 안전하다.

// BOJ_10818.cpp
#include<iostream>
using namespace std;
#define MAX(A,B) (A>B ? A:B)
#define MIN(A,B) (A<B ? A:B)

int main()
{
    int N, a;
    int max, min;

    cin.tie(NULL);
    ios::sync_with_stdio(false);    
    
    cin>>N>>max;
    min = max;
    for(int i=0;i<N-1;i++)
    {
        cin>>a;
        max = MAX(max,a);
        min = MIN(min,a);
    }
    cout<<min<<" "<<max<<endl;
    
    return 0;
}
반응형

댓글