Go, Vantage point
가까운 곳을 걷지 않고 서는 먼 곳을 갈 수 없다.
Github | https://github.com/overnew/
Blog | https://everenew.tistory.com/
티스토리 뷰
반응형
백준 문제를 풀던 중 분명히 예제 입력에서는 제대로 된 출력이 나오는데도 정답 소스코드를 제출하는 경우 시간 초과가 발생하는 경우가 있었다. 아무리 코드를 뜯어보아도 최적화에는 문제가 없다고 생각했는데 cout에서 주로 개행을 위해 사용되는 endl을 '\n'으로 바꿔주자 정답을 맞힐 수 있었다.
그러한 이유는 다음과 같다.
endl의 경우 스트림 버퍼의 끝에 \n을 삽입해주고 flush까지 수행하여 버퍼를 비워준다. std::cin과 같이 입력을 받을 경우, 이전의 데이터가 버퍼에 남아있으면 사용자의 값입력을 받지 않고 그대로 버퍼의 값을 사용한다. 즉 버퍼를 깨끗하게 지워주어야 다음 값을 입력받을 수 있다. 이때 flush를 통해 버퍼를 비워줄 수 있다.
C에서는
fflush(stdin);
와 같이 사용하고
C++에서는
cin.ignore();
로도 같은 flush기능을 수행 할 수 있다.
즉, endl은 호출이 될 때마다 개행과 함께 flush를 추가로 수행하므로 단순한 \n을 삽입하는 것보다 성능면에서 상당히 비효율 적이다. 알고리즘 문제에 특히 출력이 많은 문제라면 endl의 사용을 주의해야 한다. 되도록 \n을 대신 사용하는 습관을 기르자.
반응형
'개발 > C++' 카테고리의 다른 글
[C++] Vector copy constructor의 깊은 복사 여부 (0) | 2023.07.04 |
---|---|
[C++] 동일 클래스 간의 private 멤버 접근이 가능한 이유 (0) | 2020.09.30 |
댓글