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

문제 바로가기

https://www.acmicpc.net/problem/10818


관련 알고리즘

- 해당 없음


정답 및 해설

정수 N개를 입력받아 그중 최솟값과 최댓값을 차례대로 출력하는 문제이다.

최솟값과 최댓값을 저장할 변수를 정의하고,

정수를 새로 입력받을 때마다 기존 값과 비교하여 업데이트하는 것으로 간단하게 해결할 수 있다.

이때 최솟값의 초기값은 입력할 수 있는 최대정수보다 큰 수,

최댓값의 초기값은 입력할 수 있는 최소정수보다 작은 수로 해야 한다. 

최솟값의 경우만 살펴보도록 하자.

만약 초기값보다 작은 정수가 입력되지 않는다면 초기값이 출력되어 오답을 만들어낼 수 있다.

따라서 입력될 수 있는 모든 정수보다 큰 수(1,000,000)를 초과하는 수로 초기값을 설정해야 한다.

ex) 초기값을 100으로 설정했으나, 입력받은 수 중 100보다 작거나 같은 수가 없으면, 최솟값으로 100을 출력 > 오답!


C++

더보기
#include<bits/stdc++.h>
#define INF 987654321
using namespace std;
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    int N,num,MIN=INF,MAX=-INF;
    cin>>N;
    while(N--){
        cin>>num;
        MIN=min(num,MIN);
        MAX=max(num,MAX);
    }
    cout<<MIN<<' '<<MAX;
}

 

Line 해설
2 define 매크로를 사용하여 987654321을 INF로 치환합니다.1)
1,000,000보다 큰 수 아무거나 사용해도 무관하지만 통상 987654321 혹은 1234567890을 많이 사용합니다.
5~6 입력받는 정수가 최대 1백만개 이므로 빠른 입출력을 위해 ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);를 사용하였습니다.2)
7 최솟값 변수 MIN을 정의하고 동시에 INF(987654321)로 초기화합니다.
최댓값 변수 MAX를 정의하고 동시에 -INF(-987654321)로 초기화합니다.
8~10 정수의 개수 N을 입력받고 while(N--) 반복문을 이용하여 N개의 정수를 num변수에 입력받습니다.
11~12 입력받은 정수 num을 기존 최소,최댓값인 MIN,MAX와 비교하여 값을 업데이트합니다.
MIN은 기존 최솟값인 MIN과 새로 입력받은 num중 작은 값(min)으로,
MAX는 기존 최댓값인 MAX와 새로 입력받은 num중 큰 값(max)으로 설정해줍니다.3)
14 반복문이 끝난 후, 구한 최솟값과 최댓값을 출력합니다.

1) #define 은 매크로라고 부릅니다. #define A B 는 해당 코드내에서 B를 A로 치환하여 사용할 것을 의미합니다.

#define INF 987654321 : 이 코드내에서 INF라는 값은 987654321을 뜻함.

 

2) ios::sync_with_stdio(0); 함수는 c언어의 stdio와 c++의 iostream을 동기화를 끊어주는 역할을 합니다.

cin.tie(0); 과 cout.tie(0); 은 cin과 cout의 묶음을 풀어주는 역할을 합니다.

결과적으로 프로그램의 입출력이 빨라지게 되는데 자세한 원리와 설명은 추후에 다루도록 하겠습니다.

 

3) min함수와 max함수는 <algorithm> 라이브러리에서 제공하는 함수입니다. 위 코드에서 사용한 <bits/stdc++.h>헤더파일내에 해당 라이브러리가 포함되어있어 따로 정의하지 않았지만, <iostream> 라이브러리만 정의했다면 <algorithm> 라이브러리를 따로 include 해주어야 합니다.

min(A,B) : A와 B중 작은 값을 반환해줍니다.

max(A,B) : A와 B중 큰 값을 반환해줍니다.