본문 바로가기

C++

(C++) - cout,cin 실행 속도 높이기(시간초과 해결법)

반응형

🍳머리말

 문제를 푸실 때 printf, scanf를 사용했을 때 A/C를 받았지만 cout, cin을 사용했을 때 시간초과가 나는 경우가 있습니다. 이에 대한 이유와 해결방법을 설명한 글입니다.


📕 왜?

 이는 cout, cin printf, scanf보다 실행 속도가 느리기 때문에 발생합니다. 평소에는 시간 차이가 별로 없지만 입력이나 출력이 몇 십만 정도로 많아지면 시간이 크게 차이나게 됩니다. 따라서 이 부분을 유의하여 코드를 작성하려면 cout, cin 대신 printf, scanf를 사용하시는 것을 권장하지만 cout, cin을 계속 사용하고 싶은 분들이라면 꼭 아래 방법을 이용하시는 것을 권장합니다. 아래 코드는 cout, cin의 성능을 printf, scanf만큼 빠르게 만들어주는 역할을 합니다.


📕 해결법

다음 2개의 코드를 작성해주시면 됩니다.

📔 ios::sync_with_stdio(false);

ios::sync_with_stdio cpp의 iostream을 c의 stdio와 동기화시켜주는 역할을 합니다. 여기서 iostream, stdio의 버퍼를 모두 사용하기 때문에 딜레이가 발생하게 됩니다. ios::sync_with_stdio(false)는 이 동기화 부분을 끊는 함수입니다. 이를 사용하면 c++만의 독립적인 버퍼를 생성하게 되고 c의 버퍼들과는 병행하여 사용할 수 없게 됩니다. 대신 사용하는 버퍼의 수가 줄어들었기 때문에 속도는 높아지게 됩니다.

📔 cin.tie(NULL);

디폴트는 cout,cin이 tie되어 있습니다.

만약 코드에서

 

cout << "hi"; cin >> name;

 

이 순서라면 디폴트의 경우 "hi"가 먼저 출력되고 name을 입력할 것입니다. 

그러나 untie의 경우엔 cout으로부터 cin을 untie해주기 때문에 먼저 입력부터 하게 됩니다. 

그러나 "hi"는 보이지 않는데, cout은 디폴트에선 출력명령을 내리거나 버퍼가 가득찼을 경우에만 flushed되고 출력되기 때문입니다.

따라서 cin을 cout에서 untie하고 싶다면 cin으로 입력하기 전에 cout으로 출력을 할 때마다 지속적으로 flush를 해줘야 합니다. 그래야 cout을 하고 cin을 하고 싶을 때 그 순서대로 프로그램이 실행될 겁니다.