2025년, 코딩은 선택이 아닌 필수!

2025년 모든 학교에서 코딩이 시작 됩니다. 먼저 준비하는 사람만이 기술을 선도해 갑니다~

강의자료/정보영재

cin cout 사용시 타임아웃 발생-> 시간초과 해결하는 방법

원당컴퓨터학원 2018. 11. 19. 17:04

제가 몇주 전부터 알고리즘 상으로는 최대 600만번 계산이 되어 시간초과가 나올 수가 없는데 (알고리즘상 1초당 최대 1억번 연산 처리를 기준으로 함) 계속해서 타임아웃이 발생하더라구요.


무엇이 문제인지 몰라서 알고리즘은 맞는데 구현이 잘못 된 줄 알고 수십번도 더 제출해 보았는데요...

결국 몇주동안 풀지 못했던 문제가...

scanf,printf 를 사용하지 않고 cin cout 을 사용해서 타임아웃이 걸렸다는 것을 아는 순간 맥이 쫙 빠지네요...ㅠ.ㅠ


알고리즘으로는 전혀 문제가 없는데 또 다른 알고리즘을 요구하는 문제인줄 알고 알고리즘 해법을 찾으러 구글링 하다가 도저히 해법을 못찾아 포기했던 문제였는데요.. 우연한 계기로 cin cout 이 scanf printf 보다 컴파일 속도가 느린것을 확인했습니다.

그래서 그 문제를 scanf,printf 로 바꾸었더니 바로 sucess 가 뜨네요...


만약 cin,cout 을 계속 사용하려고 하면 다음과 같이 미리 선언을 해 주면 된다고 합니다.

1. ios::sync_with_stdio(false);

- ios::sync_with_stdio 은 cpp의 iostream을 c의 stdio 와 동기화 시켜주는 역할을 합니다. 따라서 iostream,stdio의 버퍼를 모두 사용하기 때문에 딜레이가 발생하게 됩니다. 따라서 옵션을 false로 해 주게 되면 동기화를 하지 않게 되고 c++만의 독립적인 버퍼를 사용하게 됩니다.

2. cin.tie(NULL);

- 기본적으로 cin은 cout 에 바인딩되어 있어서 cin에서 i/o작업을 수행하기 전에 flush가 호출되어 IO 부담이 증가 합니다. 

따라서 실행속도를 높이려면 tie(NULL)로 cout을 바인딩 해제하여 사용할 수 있습니다.


3. cout 에서 endl 을 사용하는 것 보다는 개행문자 '\n'을 사용하는 것이 좋다고 합니다.

endl 에서는 개행문자를 출력 하면서 출력 버퍼를 비우는 역할까지 수행하기 때문에 속도가 느리다고 합니다.


일반적인 프로그램을 만들때는 특별히 문제가 되지 않을것 같은데...

시간이 생명인 알고리즘 문제 풀이때 타임아웃이 나오면 완전 치명적입니다.

이러한 점을 인지해서 cin cout 사용할때 충분히 고려해서 사용해야 할것 같습니다.




사업자 정보 표시
원당컴퓨터학원 | 기희경 | 인천 서구 당하동 1028-2 장원프라자 502호 | 사업자 등록번호 : 301-96-83080 | TEL : 032-565-5497 | Mail : icon001@naver.com | 통신판매신고번호 : 호 | 사이버몰의 이용약관 바로가기