[회고록]C++의 입출력 속도

Updated:

백준 문제를 풀다가 시간초과 판정을 받다

오늘 백준에서 https://www.acmicpc.net/problem/10825 문제를 풀다가 막혀서 시간을 날렸다. 보면 알시겠지만 그렇게 어려운 문제는 아니리라 본다. 근데 풀고나서 제출을 눌렀는데 시간초과가 떴다. 몇번을 점검해도 내 코드에 잘못된 점은 없었다(이렇게 생각하면 내 잘못이 맞더라). 그러다가 다른 정답코드를 보았는데 하나의 다른 점을 찾았다. 바로 출력을 할 때에 줄바꿈을 endl 이 아닌 ‘\n’ 을 사용했다는 것. 그래서 나도 endl 을 ‘\n’ 으로 바꿔 보았고 정답 판정을 받았다.

C++ 의 입출력에 관하여

예전에 알고리즘 강좌를 보다가 강사분께서 입출력으로 C++ 의 cin 이나 cout 을 사용하지 않고 C 언어의 scanf 와 printf 를 사용한 것을 본적이 있다. C++ 로 알고리즘 문제를 풀고 있었는데도 말이다. “왜 굳이?” 라는 의문을 품었던 것도 잠시 강사님의 이유와 설명을 듣고 납득을 했다. 근데 그 내용이 기억이 안나서 이후에 계속해서 C++ 의 cin 과 cout 을 사용하였다. 왜냐하면 워낙 이게 편했기 때문이다. using namepsace std; 로 std 이름공간을 편하게 쓴다고 선언만 하면 그 안에 있는 cin 이나 cout 만 타이핑 하면 되었기 때문.

아무튼 c++과 c 의 입출력 속도 차이의 원인은 C++은 cin 이나 cout 으로 입출력을 하게 되면 해당 cin 이나 cout 연산자 오버로딩 함수로 가서 또 확인하고 하는 과정들이 매번 입출력 버퍼 입장에서는 매우 부담이다. 반면 C 의 scanf 나 printf 는 입출력 버퍼에 쌓아뒀다가 한번에 입출력해버린다고 한다.

결론

프로그래머스같은 코딩테스트 환경에서는 입출력을 코더가 할 일이 없지만 백준은 입출력을 코더가 직접 해주어야 한다. 그럴때는 C 의 입출력 함수를 사용하자.

Categories:

Updated:

Leave a comment