강의실/정보영재

제가 몇주 전부터 알고리즘 상으로는 최대 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 사용할때 충분히 고려해서 사용해야 할것 같습니다.




이 장소를 Daum지도에서 확인해보세요.
인천 서구 당하동 1028-2 장원프라자 502호 | 원당컴퓨터학원
도움말 Daum 지도
8 0
  • 휴식같은 친구 2018.11.19 19:07 신고    

    ㅎ 잘 보고 갑니다.
    즐겁고 편안한 저녁시간 되세요.

  • 행복사냥이 2018.11.20 00:32 신고    

    그래도 어렵네요.^^ 잘 보고 갑니다.ㅎ

  • 버블프라이스 2018.11.20 06:07 신고    

    어렵네요^^; 포스트 오늘도 잘 읽고 갑니다-
    좋은 화요일 되세요

  • 핑구야 날자 2018.11.20 06:50 신고    

    필요한 분들에게는 도움이 되겠네요 오늘은 저도 살짝 어렵긴 하네요

  • 청결원 2018.11.20 07:36 신고    

    오늘도 어김없이 포스팅 잘 보고 갑니다
    오늘 하루도 화이팅 하는 하루 되세요~

  • 공수래공수거 2018.11.20 08:22 신고    

    같은 문제의 고민을 겪으신분은 충분히 참조가 되겠습니다. ㅎ

  • 이진숙 2018.11.20 20:57 신고    

    cin 에서 << 연산자를 사용이 가능했나요??