[C++] ios::sync_with_stdio(false), cin.tie(NULL)

멋진감자·2024년 12월 16일
1

알고리즘

목록 보기
45/65
post-thumbnail

백준은 프로그래머스와 다르게 cincout으로 입출력을 처리한다.
시간 초과가 났을 때 아래 코드를 추가하면 통과되는 문제들이 여럿 있었다.

ios::sync_with_stdio(false);
cin.tie();
cout.tie();

솔직히 아무 생각 없이 썼는데
이쯤 되니 슬쩍 궁금해져서 찾아봤다.

그런데 충격 사실
저 세 줄 중 첫 줄만 입출력 속도를 높이는 데 기여하고 있었다.

ios::sync_with_stdio(false);

1. 기능

C++의 iostream과 C 표준 I/O(stdio)를 동기화하는 기능을 해제한다.

2. 자세히

기본적으로, iostream은 C의 stdio와 연결되어 있어 printf, scanf 등과 함께 사용할 때 동기화를 유지한다.
동기화를 해제하면 iostream이 독립적인 버퍼를 사용하게 되어 입출력 속도가 빨라진다.

하지만 scanf, printf, puts, getchar, putchar 등 C의 입출력 함수와 혼용하면 버퍼가 분리되어 출력 순서가 꼬이거나 데이터 일관성이 깨질 수 있다.
따라서 cin, cout만 사용하는 경우에 동기화 해제를 통해 입출력 속도를 효과적으로 향상시킬 수 있다.

cin.tie(NULL);

1. 기능

cin과 cout의 연결을 끊는다.

2. 자세히

기본적으로 cin과 cout은 연결되어 있어서,
원래는 cin을 호출하면 자동으로 cout의 버퍼가 비워진다.

tie(NULL)은 이 동작을 끊어내어,
cin 호출 시 cout의 버퍼를 강제로 비우지 않도록 만든다.

입력과 출력을 독립시키므로 입력 속도를 높일 수 있지만,
출력 순서가 보장되지 않을 수 있기 때문에 순서를 직접 관리해야 한다.

3. 번외

cin.tie()는 cin과 cout이 연동되도록(..) 설정하는 코드고,
cout.tie()는 cout의 연결을 설정하는 코든데
연결된 다른 출력 스트림이 없어서
아무 의미 없이 자리만 차지하는 넘이었던 것;

입출력 속도 높이기

정리하자면, 아래 코드가 백준에서 먹히는 정석 코드다.

#include <iostream>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    return 0;
}

다만,
1. 입출력 순서 안 꼬이게 잘 관리하기
2. C의 입출력 함수와 혼용하지 않기

요 두 가지만 잘 기억하여 사용하도록 하자.

profile
난멋져

0개의 댓글