2024
12.02

인풋 최적화

텍스트 파일에서 많은 인풋을 불러올 경우 입출력 최적화 코드를 별도로 작성하지 않으면 시간초과가 발생한다.

 

시작 시 다음의 코드 사용할 것

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

 

1. ios::sync_with_stdio(false)

C++ 표준 입출력(cin, cout, cerr)과 C 표준 입출력(scanf, printf)은 기본적으로 동기화되어 있다.

해당 코드를 설정하면 C++ 표준 입출력과 C 표준 입출력의 동기화를 해제한다.

 

동기화 해제를 통해 C++ 표준 입출력이 독립적으로 작동하게 되어 불필요한 동기화 작업을 피할 수 있게 되어 성능이 향상된다.

특히나 C++ 표준 입출력(cin, cout)만 사용하는 경우 성능 향상이 크다.

 

그러나 c의 입력과 c++의 입력인 printf 와 cin을 동시에 사용하면 예상치 못한 동작이 발생하니 주의할 것.

 

2. cin.tie(0)

기본적으로 cin은 cout과 연결되어 있어, cin에서 입력을 받을 때 cout이 자동으로 버퍼를 플러시(출력)한다.

cin.tie(0)를 설정하면, cin과 cout의 연결이 해제됩니다.

 

입력 작업을 수행하기 전에 cout이 플러시되지 않으므로, 불필요한 버퍼 플러시가 줄어들어 성능이 향상된다.

출력이 반드시 입력 전에 보일 필요가 없는 경우에 사용한다.

 

3. cout.tie(0)

보통 cout.tie(0)는 별도의 효과를 제공하지 않으며, 대부분의 경우 불필요하다.

그러나 대칭적으로 작성하는 경우 코드의 가독성을 위해 추가된다고 함.

 

 

endl을 '\n' 로 대체하자

코딩테스트에서는 줄 바꿈에 endl을 사용하지 말 것. '\n' 을 사용하자.

 

1. endl

endl은 줄바꿈 문자인 '\n'을 출력하고, 버퍼를 강제로 플러시합니다.

버퍼 플러시는 시스템 호출을 발생시키며, 이는 성능에 큰 영향을 미칠 수 있습니다.

 

2. '\n'

'\n'은 단순히 줄바꿈 문자로 출력되며, 버퍼 플러시를 하지 않습니다.

 

버퍼는 일정량이 차거나 프로그램이 종료될 때 자동으로 플러시되기 때문에, 반복적인 출력 작업에서는 '\n'을 사용하는 것이 성능 면에서 더 효율적이다.

 

https://stackoverflow.com/a/30968225/3163618

 

How can I print a newline without flushing the buffer?

I was experimenting with c++ trying to figure out how I could print the numbers from 0 to n as fast as possible. At first I just printed all the numbers with a loop: for (int i = 0; i < n; i++...

stackoverflow.com

 

https://www.acmicpc.net/problem/15552

C++을 사용하고 있고 cin/cout을 사용하고자 한다면, cin.tie(NULL)과 sync_with_stdio(false)를 둘 다 적용해 주고, endl 대신 개행문자(\n)를 쓰자. 단, 이렇게 하면 더 이상 scanf/printf/puts/getchar/putchar 등 C의 입출력 방식을 사용하면 안 된다.

 

소수점 표기 자리수 지정하기

cout << fixed; //  소수점을 고정시켜 표현
cout.setf(ios::fixed); // 윗줄이랑 같은표현
cout.unsetf(ios::fixed); // 픽스드 해제

cout.precision(1); // 소수점 1자리 표시

 

COMMENT