백준은 프로그래머스와 다르게 cin
과 cout
으로 입출력을 처리한다.
시간 초과가 났을 때 아래 코드를 추가하면 통과되는 문제들이 여럿 있었다.
ios::sync_with_stdio(false);
cin.tie();
cout.tie();
솔직히 아무 생각 없이 썼는데
이쯤 되니 슬쩍 궁금해져서 찾아봤다.
그런데 충격 사실
저 세 줄 중 첫 줄만 입출력 속도를 높이는 데 기여하고 있었다.
ios::sync_with_stdio(false);
C++의 iostream과 C 표준 I/O(stdio)를 동기화하는 기능을 해제한다.
기본적으로, iostream은 C의 stdio와 연결되어 있어 printf, scanf 등과 함께 사용할 때 동기화를 유지한다.
동기화를 해제하면 iostream이 독립적인 버퍼를 사용하게 되어 입출력 속도가 빨라진다.
하지만 scanf, printf, puts, getchar, putchar
등 C의 입출력 함수와 혼용하면 버퍼가 분리되어 출력 순서가 꼬이거나 데이터 일관성이 깨질 수 있다.
따라서 cin, cout
만 사용하는 경우에 동기화 해제를 통해 입출력 속도를 효과적으로 향상시킬 수 있다.
cin.tie(NULL);
cin과 cout의 연결을 끊는다.
기본적으로 cin과 cout은 연결되어 있어서,
원래는 cin을 호출하면 자동으로 cout의 버퍼가 비워진다.
tie(NULL)
은 이 동작을 끊어내어,
cin 호출 시 cout의 버퍼를 강제로 비우지 않도록 만든다.
입력과 출력을 독립시키므로 입력 속도를 높일 수 있지만,
출력 순서가 보장되지 않을 수 있기 때문에 순서를 직접 관리해야 한다.
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의 입출력 함수와 혼용하지 않기
요 두 가지만 잘 기억하여 사용하도록 하자.