Bakjoon Q10818 - C++

Q10818


Problem

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

Input

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

Output

첫째 줄에 주어진 정수 N개의 최솟값과 최댓값을 공백으로 구분해 출력한다.

예제 입력

1
2
5
20 10 35 30 7

예제 출력

1
7 35

나의 제출

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<iostream>
using namespace std;

int main(){
    int a, b;
    cin >> a; //입력받을 개수
    int max=-1000000;
    int min=1000000;
    while(a--){
        cin >> b;
        if(max < b)
            max = b;
        if (min > b)
            min = b;
    }
    printf("%d %d", min, max);
}

추가 내용

이런식으로 하면 풀리기는 풀리는데 시간이 진짜 오래걸린다. 이는 cin, cout의 최적화가 되어있지 않기 때문이다. 따라서 이는

1
2
3
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);

이 코드들을 이용해서 해결할 수 있다.
먼저 이 함수들을 이용하기 위해서는 “<bits/stdc++.h>“라는 라이브러리를 먼저 include해야한다.

  • ios::sync_with_stdio(false);
    이건 cout의 sync를 풀어주는 코드이다(false). iostream과 stdio.h 간 동기화를 풀어준다는 것이다(구체적으로 버퍼 이야기가 나오는데 궁금하면 다시 찾아보자). 디폴트는 true로 되어있다.
    sync를 풀면 연산속도가 기존에 비해 훨씬 빨라진다. 원래 디폴트상으로 c++는 c의 함수와 혼용해서 사용해도 문제가 없도록 되어있다. 그렇지만 sync를 푼 상태로 출력을 해보면 (아래 코드 참고) 이런 코드가 있어도 당연히 1, 2 순으로 출력되는 것이 아니라 어떤 순으로 출력될지 알 수가 없다. 요컨데 동기화를 풀면 2, 1이 출력될 수도 있다는 것이다.
    따라서 이 코드를 사용했다면 getchar, printf같은 c함수와 cout같은 cpp 함수를 혼용해서 쓰지 않아야 한다.
    1
    2
    
    printf("1");
    cout << "2";
    
  • cin.tie(NULL); cout.tie(NULL);
    위 두 구문은 cin과 cout이 묶여있는 것을 풀어준다. 디폴트상으로 cin과 cout는 서로 묶여있는데, 이 상태에서는 cin 앞에 cout이 있어도 직관적으로 cout으로 출력을 해준다. 그렇지만 풀어주면 출력이 씹힌다.
    1
    2
    
    cout << "Enter name:";
    cin >> name;
    

    직관상으로 당연히 enter name이 뜨고 입력을 받아야 할 것 같아보이지만 tie가 풀린 상태에서는 name을 입력받기를 기다리기만 하고 cout는 씹힌다.

If cin and cout are tied, you can expect the output to be flushed (i.e., visible on the console) before the program prompts input from the user. If you untie the streams, the program might block waiting for the user to enter their name but the “Enter name” message is not yet visible (because cout is buffered by default, output is flushed/displayed on the console only on demand or when the buffer is full).
-stackoverflow

총평

문제 자체는 정말 쉽지만, 함수의 최적화를 이용해야만 훨씬 더 시간을 단축할 수 있는 문제였다.