blurry   3년 전

11, 12 라인을 scanf("%d\n", &n) 으로 바꿔서 답은 맞았습니다.

그런데 어떻게 해봐도 scanf 을 쓰지 않고 cin만으로 해결 할 수 있는 방법을 모르겠습니다.

cin이 버퍼에 개행문자를 남기니까 getchar로 받아와야겠다는 생각으로 12번줄에 getchar()를 더했던 건데, 예상과는 다르게 12의 getchar()가 입력 둘째 줄의 첫 숫자를 받아오더라구요. 결과적으로 첫 수가 버려져 합이 달라져버립니다.

그래서 12번 라인을 지워도 보았지만, 이 경우 제 환경에서 정상적으로 답이 나오지만 채점에서는 틀렸다고 나옵니다.

혹시 stdio.h 와 iostream 의 buffer가 서로 다른 것을 의미하거나 해서 개행이 안받아와지는건지,

다른 이유가 있는지 궁금합니다.

sait2000   3년 전

ios::sync_with_stdio(false) 는 C++ 계열 입출력과 C 계열 입출력의 동기화를 끕니다. 따라서 cin과 getchar를 같이 쓰시면 안 됩니다.

blurry   3년 전

아하..

해당 줄 삭제하니 통과가 되는군요.

아무렇게나 가져다 쓰던 코드의 의미를 알아갑니다. 감사합니다.

ckdgus2482   3년 전

조금 더 보충하자면 sync_with_stdio(false)는 본래 멀티스레드 환경에서 표준입출력 스트림에 대한 동기화를 끄는 것입니다.

스레드 동기화 작업이 오버헤드가 큰데 BOJ에서는 어차피 싱글스레드로 돌리기 때문에 불필요한 오버헤드를 줄이기 위해서 권고하는 방법입니다.

그리고 cin.tie(0)은 입력스트림과 출력스트림의 동기화를 끄는 것입니다.
온라인 쿼리처럼 입력과 출력을 번갈아서 하는 경우 이 동기화를 끄는 것이 성능향상에 도움이 됩니다.

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