shjv   5년 전

안녕하세요^^

https://www.acmicpc.net/blog/v...

백준 사이트에서 입/출력 속도 비교글은 이미 읽었지만,

이문제에서 우선순위큐를 사용한 방법으로 문제를 풀었는데요.

cin,cout으로 제출하면 시간초과가 뜨고

printf,scanf로 하면 20ms로 통과가 되네요.

시간제한이 2초라고 적혀있는데 

어쩌다가 100배나 차이가 나게되는 것일까요?????

궁금해서 여쭤봅니다.

mystika   5년 전

C++ <iostream> 표준 입출력은 C와 다르게 구현이 되어있습니다.

그래서 기본적으로 C++에서 입출력 작업을 할 때마다 C의 표준 입출력과 동기화되어 있도록 설정이 되어 있는데, 이 과정이 생각보다 꽤 느립니다.

또, C++은 다른 마지막으로 작업한 I/O 스트림이 아닌 다른 곳에서 입출력 작업하려고 할 때 입출력 버퍼를 비우는 작업을 수행하는데, 이 상태를 스트림이 Tied 되어있다라고 합니다.


이러한 상황을 해결기 위해서는 아래와 같이 하시면 됩니다.

ios_base::sync_with_stdio(false); 로 C 표준 입출력과의 동기화를 하지 않도록 설정하여 속도를 빠르게 올릴 수 있고,

cin.tie(NULL); cout.tie(NULL); 이 작업으로 자동으로 스트림을 untie 시켜서 자동적으로 입출력 버퍼를 비우지 않도록 설정할 수 있습니다.

댓글을 작성하려면 로그인해야 합니다.