오늘 백준 문제를 풀다가 알게된 사실.
c++ 의 표준 입출력(iostream)에서 주로 입출력의 속도를 향상시키기 위해 다음과 같은 코드를 맨 상단에 적는데,
ios_base::sync_with_stdio(false)
백준에서 문제를 풀다가 이 코드가 있고 없고에 따라서 오답과 정답으로 채점되는 경험을 했다.
무엇이 문제인고 하니,
ios_base::sync_with_stdio(false) 과 같이 입력을 하면 iostream의 입출력 기능과 stdio 의 입출력 기능을 섞어서 사용하면 잘못된 결과가 나타날 수 있다는 것이었다.
해당 코드에는 cin, cout, getchar()가 사용되고 있었다.
ios_base::sync_with_stdio() 에 대해서 찾아보니 이 함수는 표준 c++스트림과 c 스트림을 동기화 시켜주는 함수라고 한다. ios_base::sync_with_stdio(true)로 설정하면, c++의 버퍼는 사용되지 않고, c의 버퍼를 같이 사용하는(?) 것으로 대충 해석된다. 또한 ios_base::sync_with_stdio(false)로 설정하면, c++ 스트림이 독립된 버퍼를 사용하여 c와 동기화 되지 않고, 입출력 순서가 이상해질 수 도 있음을 설명하는 것 같다.
관련 링크
https://en.cppreference.com/w/cpp/io/ios_base/sync_with_stdio