백준/C++

[백준] 10818번: 최소, 최대 | C++ 풀이

성실한 당근농부 2023. 5. 10. 22:05

# 문제

N개의 정수가 주어진다. 이때, 최솟값과 최댓값을 구하는 프로그램을 작성하시오.

 

 


 

# 풀이

지난 번 리뷰한 10871번을 풀었다면 어렵지 않은 문제다. 바로 정답 소스코드를 확인해보자.

 

#include <iostream>
using namespace std;

int main(){
    ios_base::sync_with_stdio(false);    // 두 표준 입출력 동기화 해제
    cin.tie(NULL);    // 입력과 출력 묶음을 풀기

    int n, max, min;
    cin >> n;

    int num[n];
    for(int i=0; i<n; i++){
        cin >> num[i];
    }

    max = min = num[0];
    for(int i=1; i<n; i++){
        if(max < num[i]) max = num[i];
        else if(min > num[i]) min = num[i];
    }

    cout << min << ' ' << max;
    return 0;
}

 

우선 이번에도 빠른 입출력을 사용하고, 글의 마지막에 기본 입출력을 사용했을 경우와의 차이를 올려두었다.

 

첫째 줄에서 주어진 정수의 개수 n을 받아 그 크기만큼 1차원 정수 배열을 만들어준다.

n을 크기로 설정해준 이유는 0부터 n-1까지의 인덱스에 n개의 값을 넣기 위함이다.

그리고 지난 10871번 문제와 동일하게 for문을 돌며 배열에 숫자들을 저장해준다.

입력되는 정수의 범위는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같다.

 

 

 

max = min = num[0];
for(int i=1; i<n; i++){
    if(max < num[i]) max = num[i];
    else if(min > num[i]) min = num[i];
}

 

우리는 입력된 n개의 정수 중 최솟값과 최댓값을 찾아내야 한다.

그렇다고 해서 처음부터 범위의 끝 값과 비교해 최소, 최대를 찾기보다는, 정수 범위 내에 최솟값과 최댓값이 존재하는 것이 분명하므로 배열의 첫번째 값을 기본 최소, 최댓값으로 지정해주는 방식을 택하였다.

 

그리고 배열 인덱스 1부터 비교 탐색하며 최소, 최대를 변경해주었다.

배열의 끝까지 탐색 후 저장된 최솟값과 최댓값을 출력해주면 끝이다.

 

배열을 쓰지 않아도 충분히 풀 수 있는 문제지만, 1차원 배열 단계에 속한 문제기 때문에 배열을 사용해 풀어보았다.

그럼 빠른 입출력을 사용해 푼 결과를 확인해보자.

 

 

 

 

 

만약 앞서 언급한 빠른 입출력 처리를 해주지 않았더라면

시간이 300ms 이상 차이 난다.

앞으로 코드가 더 복잡해지고 길어진다면 이 차이는 더 커질 것이다.

빠른 입출력에 대해 제대로 공부하고, 잘 활용해보도록 하자.

 

 


 

 

 

10818번: 최소, 최대

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

www.acmicpc.net

 

728x90