dygks232   4달 전

ios::sync_with_stdio(false);

저는 이 문장을 쓰는 이유가 

cout, cin을 쓰면 printf, scanf보다 실행시간이 느린데, 저 문장을 쓰면 cout, cin을 써도 속도가 빨라진다

라고 주워들어 배웠습니다. 체감한 적은 없지만, 지금까지는 뭐 저 문장을 써도 손해볼 일이 없었기에 그냥 쭉 써왔고요.


문제가 하나 생겼습니다. 

백준의 어떤 문제를 하나 풀면서 아래와 같은 코드를(include 등등은 생략) 제출하였는데, 아무리 생각해도 맞는 코드가 "틀렸습니다"가 떴습니다.

설마설마 하다가 ios::sync_with_stdio(false); 한문장만 지우고 다시 제출했더니 "맞았습니다"가 떴습니다.


제가 궁금한 점은, 저 한 문장이 이 코드에 끼친 영향이 무엇일까? 입니다.

지금까지 cout, cin과 함께 저 문장을 써도 오답처리된적은 없었는데, 혹시 string을 입력받는 getline함수에서 문제가 발생하는걸까 싶어 이 코드에서 getline을 cin으로 바꿔봐도(이 문제에서 띄어쓰기를 포함한 입력은 고려할 필요가 없습니다.) 같은 문제가 발생하여 그건 아닌거같았고요...

대체 저 코드가 하는 역할과 저 코드가 왜 오답처리가 되는 요인이었는가? 가 궁금합니다!!

indioindio   4달 전

ios::sync_with_stdio는 cpp의 iostream을 c의 stdio와 동기화시켜주는 역할을 합니다.

기본값인 true일 때는 cout << "HI"; printf("BYE"); cout<<"hi" 가 순서대로 출력되지만, false일때는 어떤 순서로 출력될지 알 수가 없죠. 

그렇기 때문에 ios::sync_with_stdio(false); 를 추가하시면, 

iostream 함수인 cin/ cout을 stdio 함수인 getchar()와 같이 쓰시면 안됩니다.

dygks232   4달 전

아 그러면 cin>>num; 다음 getchar();을 써놓았지만, getchar가 num에넣고자 입력한 값의 숫자 하나를 먹어버릴수도 있고 뭐 그런얘기군요.


그런데 혹시, 말씀해주신 예시같이 간단하게

for (int i = 0; i < 100000; i++){
cout << "A" << i; printf("a%d", i); cout << endl;
}

이런걸 실행해봤는데, 순서가 바뀌는거같지는 않더라고요... 출력뿐만아니라 입력을 같이하고, 좀더 복잡한 데이터를 처리할 때 발생하는 문제인가요?

아니면, 비주얼스튜디오의환경과 백준채점환경이 다르다거나 하는문제인가요?

indioindio   4달 전

음..네 윈도우 환경에서는 ios:sync_with_stdio(false)를 써도 입력속도에 큰 차이가 없다는 글을 읽은 것 같은데(확실치는 않습니다), 그것과 관련있는지도 모르겠네요.

우분투에서 g++로 컴파일하여 돌려보았을 때는 
A99986
A99987
A99988
A99989
A99990
A99991
A99992
A99993
A99994
A99995
A99996
A99997
A99998
A99999
a99985a99986a99987a99988a99989a99990a99991a99992a99993a99994a99995a99996a99997a99998a99999
이런 출력이 나옵니다.

dygks232   4달 전

아 확실히 다른환경에서는 다르게되네요!! 덕분에 하나 배우고갑니다ㅠㅠ 감사합니다

indioindio   4달 전

네 저 차이는 아마 visual c++과 g++의 차이에서 오는 것 같습니다.

ios::sync_with_stdio(false); 일 때 stdio와 iostream이 개별적으로 동작할 수 있도록 허가해주는 것 뿐이라서
제 추측이지만 visual c++는 저 구문을 그냥 무시하는 것 같네요. 

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