백준이나 코드포스같은 알고리즘 문제 사이트에서 C++언어를 사용하는 경우,

매우 많은 입력 혹은 매우 많은 출력을 요구하는 문제가 있을 수 있습니다.

그런 경우에는 효율적인 알고리즘을 사용하더라도 시간초과가 되는 경우가 많이 있습니다.

기본적으로는 c++의 iostream과 cstdio의 스트림이 동기화 되어 있는데, 이를 해제하면 입출력 속도가 빨라집니다.

 

iostream과 cstdio의 스트림 동기화를 끊기 위해 사용하는 함수가 ios_base::sync_with_stdio(bool sync=true)입니다.

bool 타입의 매개변수 sync의 값은 기본적으로 true인데, 이를 false로 셋하면 동기화를 끊을 수 있습니다.

 

추가적으로 cin의 tie함수를 통해 cin에 바인딩된 output stream을 NULL값으로 초기화 합니다.

기본적으로 cin은 cout에 바인딩되어 있습니다.

 

#include <iostream>
using namespace std;

int main(){
    // cin.tie()를 호출하면 현재 바인딩된 output stream의 주소를 리턴한다.
    // 이는 cout의 주소와 같음을 알 수 있다.
    cout << cin.tie() << "\n";
    cout << &cout << "\n";
    return 0;
}

최종적으로 다음과 같은 코드를 앞에 두면 입출력이 빨라집니다.

단, C의 입출력함수인 printf, scanf 등을 cin, cout과 함께 사용해선 안됩니다.

#include <iostream>
using namespace std;

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    return 0;
}

+ Recent posts