[C++] 시간 제한 초과 방지를 위한 입출력(IO) 가속기 사용법

Date:     Updated:

카테고리:

태그:

🎯 목표

코딩 테스트에서 시간 제한 초과(TLE)를 방지하기 위해 C++의 입출력 가속기(빠른 입출력 설정)를 사용하는 방법을 정리한다.

주요 IO 가속기 함수

코딩 테스트에서 자주 사용하는 IO 가속기 코드는 아래와 같다.

std::ios::sync_with_stdio(false); // C와 C++의 입출력 버퍼 동기화 해제(false 대신 0 사용 가능)
std::cin.tie(nullptr); // cin과 cout의 묶음을 해제(불필요한 flush 방지)
std::cout.tie(nullptr); // cout과 다른 스트림과 묶을 때 사용(거의 사용 X)

각 함수의 역할과 효과를 아래에서 설명한다.


1. std::ios::sync_with_stdio(false);

  • C와 C++의 입출력 버퍼를 동기화할지 여부를 설정하는 함수이다.
  • 기본값은 true(동기화 O)로, C의 stdio(예: scanf, printf)와 C++의 iostream(cin, cout)이 버퍼를 공유한다.
  • false로 설정하면 C++의 cin, cout이 독립적으로 동작하여 입출력 속도가 빨라진다.
  • 코딩 테스트에서는 보통 C 스타일 입출력을 혼용하지 않으므로, false로 설정하는 것이 유리하다.
  • 반드시 코드의 가장 처음(입출력 전에) 호출해야 한다.

예시

std::ios::sync_with_stdio(false);

2. std::cin.tie(nullptr);

  • cincout의 묶음을 해제하는 함수이다.
  • 기본적으로 cincout과 묶여 있어서, 입력 전에 출력 버퍼를 자동으로 비운다(flush).
  • 묶음을 해제하면 불필요한 flush가 사라져 입출력 속도가 더 빨라진다.
  • nullptr로 설정하면 tie를 끊는다는 의미이다.

예시

std::cin.tie(nullptr);

3. std::cout.tie(nullptr); (거의 사용 X)

  • cout을 다른 스트림과 묶을 때 사용하지만, 실전 코딩 테스트에서는 거의 사용하지 않는다.
  • 혹시나 cout이 다른 스트림과 tie되어 있다면 해제하는 용도로 쓸 수 있다.
  • 대부분의 경우 std::cin.tie(nullptr);까지만 해도 충분하다.

예시

std::cout.tie(nullptr);

💡 코딩 테스트에서의 활용

  • 세 줄을 모두 사용하는 것이 관례처럼 굳어져 있다.
  • 입출력 속도가 최대 10배 이상 빨라질 수 있으므로, 입력 데이터가 많을 때는 반드시 사용하자.
  • C 스타일 입출력(scanf, printf)과 혼용하면 안 됨(동기화 해제 시 버퍼 꼬임 발생 가능).

실전 예시

#include <iostream>

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr); // 생략해도 무방

    int n;
    std::cin >> n;
    std::cout << n << '\n';
    return 0;
}

📝 정리

  • std::ios::sync_with_stdio(false); : C/C++ 입출력 버퍼 동기화 해제(입출력 가속)
  • std::cin.tie(nullptr); : cin/cout 묶음 해제(불필요한 flush 방지)
  • std::cout.tie(nullptr); : 거의 사용하지 않지만 혹시 모를 tie 해제
  • 코딩 테스트에서는 세 줄 모두 맨 앞에 써두는 것이 안전하다!

Cpp Coding Test 카테고리 내 다른 글 보러가기