C++

[C++] 시간초과 해결방법

jungeun919 2024. 9. 20. 15:01

ios_base::sync_with_stdio(false);

ios_base는 입출력 스트림의 기반 클래스로 cin, cout과 같은 표준 입출력 객체들은 ios_base에서 상속받아 동작한다. C++에서 입출력 작업을 수행할 때, 기본적으로 C++ 표준 입출력(iostream)과 C의 표준 입출력(stdio)이 동기화되도록 설정되어 있어서 이 과정에서 딜레이가 발생하여 성능이 저하된다.

 

ios_base::sync_with_stdio(false) 코드를 추가하여 C++ 표준 스트림과 C 표준 스트림 간의 동기화를 비활성화시켜 독립적인 버퍼로 작동하게 만들어 실행속도를 개선할 수 있다. 이 설정 이후에는 C와 동기화가 해제되었기 떄문에 C의 표준 입출력 방식(scanf, printf, gets. puts)을 사용할 수 없다.

 

cin.tie(NULL);

cin과 cout은 기본적으로 묶여 있어, cin으로 입력을 받을 때 자동으로 cout이 출력 작업을 먼저 처리하게 된다. C++에서는 새로운 입출력 작업이 오면 기존 입출력 작업을 플러시(flush) 하여 버퍼를 비운다. 한 스트림(cin)이 다른 스트림(cout)에서 입출력 작업을 진행하기 전에, 버퍼가 자동으로 비워지면서 이전 작업의 출력이 완료됨을 보장한다. 이 경우 입출력이 반복될 때, 버퍼를 지우느라 시간이 오래 걸린다.

 

cin.tie(NULL);은 cin과 cout의 연결을 해제하여, cin이 입력을 받을 때 cout이 즉시 출력되는 것을 방지한다. 이로써 입출력 작업의 속도를 단축시킬 수 있다.

 

cout.tie(NULL);은 cout과 다른 출력 스트림(문자열 스트림, 파일 스트림 등)의 동기화 해제하여 다른 스트림과 연결되지 않고 독립적으로 작동하도록 만든다. 일반적으로 cin.tie(NULL);만으로 충분한 경우가 많지만 여러 스트림을 동시에 사용하는 경우에 사용하여 출력 속도를 추가로 개선할 수 있다.

 

endl을 "\n"으로 변경

endl = 개행(줄바꿈) + flush 연산(출력 버퍼 비우기)

"\n" = 개행(줄바꿈)

 

endl을 사용하면 내용을 출력하는 것뿐만 아니라 출력 스트림의 버퍼를 비우는(flush) 작업도 수행되기 때문에 딜레이가 발생한다. 이로 인해 자주 사용하면 성능에 부담을 줄 수 있다. endl은 주로 즉시 출력을 보장해야 하는 상황에서 사용하도록 한다.

 

반면 "\n"은 개행만 수행하고 버퍼를 비우지 않는다. 출력 데이터는 출력 버퍼에 쌓이고, 스트림이 가득 차거나 프로그램이 종료될 때 한 번에 처리된다. 따라서 성능을 최적화하거나 빈번한 출력 작업이 필요한 상황에서는 "\n"을 사용하여 버퍼링을 최적화하는 것이 좋다.

'C++' 카테고리의 다른 글

구조체와 공용체의 차이  (3) 2024.10.13
[C++] 나눗셈에서 소수점 포함하기  (0) 2024.10.08
[C++] N차원 배열 선언 방법  (0) 2024.10.08