제가 몇주 전부터 알고리즘 상으로는 최대 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 사용할때 충분히 고려해서 사용해야 할것 같습니다.
'강의자료 > 정보영재' 카테고리의 다른 글
영재란? (11) | 2018.12.05 |
---|---|
에라토스테네스의 체 알고리즘 구현 방법 (3) | 2018.11.27 |
유클리드 호제법 증명 (11) | 2018.11.09 |
2017 정보올림피아드 지역대회 고등부 50번 문제풀이 (8) | 2018.10.29 |
2018년 정보올림피아드 지역대회 초등부 33번 문제풀이 (6) | 2018.09.11 |