[알고리즘] C++ 코딩테스트에 자주 사용되는 ios_base::sync_with_stdio(false) 에 대해

도톨이·2025년 5월 26일
0

알고리즘

목록 보기
6/9

파이썬에서 C++로 코테 주 언어를 바꿨는데 다른 사람들의 코드에 ios_base::sync_with_stdio(false); cin.tie(nullptr); 이게 대부분 들어가 있길래 조사해보려고 한다.

ios_base::sync_with_stdio(false);
cin.tie(nullptr);

아래 자료들을 참고하면 ios_base::sync_with_stdio(false), cin.tie(nullptr) 의 설정이 무엇인지 알 수 있다.
https://en.cppreference.com/w/cpp/io/ios_base/sync_with_stdio
https://en.cppreference.com/w/cpp/io/basic_ios/tie

ios_base::sync_with_stdio

우선 ios_base::sync_with_stdioC++의 표준 스트림(cin, cout, cerr, clog)을 C의 표준 스트림(stdin, stdout, stderr)과 동기화 시킨다. 기본적으로는 이 설정이 켜져 있는데, 그 말은 즉슨 scanf와 cin, printf와 cout 같은 C와 C++ 입출력을 섞어 쓸 수 있도록 보장하는 것이다.

근데 이러한 동기화는 성능 저하를 유발할 수 있다. 그래서 프로그램이 C 입출력을 사용하지 않을 경우 이 동기화를 비활성화할 수 있다. 보통 C++ 코딩테스트에서는 C 입출력을 사용하지 않으므로 다들 ios_base::sync_with_stdio(false); 을 통해 비활성화한 것이었다.

basic_ios:tie

그리고 basic_ios:tie 는 입력 스트림과 출력 스트림을 묶는(tie) 역할을 한다. 예를 들어 cin이 cout 에 묶여 있으면, cin으로 입력을 받기 전 cout 에 쌓여있던 출력 버퍼가 자동으로 비워진다(flush)

이렇게 자동으로 flush가 일어나는 이유는, 사용자에게 출력된 내용을 확실히 보여준 다음에 입력을 받도록 하기 위해서이다. 그런데 이러한 flush 동작을 항상 필요로 하는 게 아니라 때로는 성능을 떨어뜨리는 요소가 되기도 한다. 그래서 cin.tie(nullptr);를 설정하면 cin과 cout의 연결이 끊어지면서 불필요한 flush를 피할 수 있어 입력 속도가 조금 더 빨라지게 된다.
코딩테스트와 같은 빠른 입출력이 중요한 상황에서는 이 설정이 유용하게 사용될 수 있다.

✅ 정리

  • ios_base::sync_with_stdio(false);

    • C++ 스트림(cin, cout)과 C 스트림(scanf, printf) 간의 동기화를 끈다.
    • C 스타일 입출력을 쓰지 않는다면 이 설정을 꺼서 입출력 속도를 크게 향상시킬 수 있다.
  • cin.tie(nullptr);

    • cincout 간의 연결을 끊어, cin 호출 전 불필요한 cout flush를 방지한다.
    • 입력 전에 출력이 강제로 나가지 않게 하여 약간의 성능 향상을 기대할 수 있다.

결론적으로, 코딩 테스트에서 빠른 입출력을 위해 거의 모든 C++ 개발자들이 이 두 줄을 main 함수에 기본 세팅처럼 넣는 것이다.
입출력이 많은 문제에서 시간 초과를 피하려면 꼭 기억해두자!

ios_base::sync_with_stdio(false);
cin.tie(nullptr);
profile
Kotlin, Flutter, AI | Computer Science

0개의 댓글