sc3289   2년 전

사전 정렬 문제를 제가 배열 알고리즘을 아직 공부를 안해가지고

연결리스트로 풀었는데

시간초과가 뜹니다. 그래서 게시판에 질문을 올렸는데

입출력을 cin,cout 말고 scanf랑 printf로 하면 정답뜬다고 하셔서 그렇게 해봤더니 진짜 통과했네요.....

혹시 왜 그런지 알려주실 수 있나요?,.....

sjyfantasy   2년 전

scanf printf는

"%d" 등으로 형식을 맞춰서 처리합니다.

이런 경우에 하다보면 문자열 등을 받을 때에는 무언가 불안정하죠.


그만큼 처리를 하지 않기 때문이고 그만큼 빨라지는게 아닌가 싶습니다.

kravi   2년 전

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

결론만 말씀드리면 C++에서는 아래처럼 작성하시면 됩니다.

각 두 줄이 무슨 역할을 하는지는 검색 해보시고, 

속도가 빨라지는 대신 cin이랑 scanf를 같이 쓸 수 없게 된다는 점에 유의해주세요.

sc3289   2년 전

답변 감사합니다!

cin,cout이 마구잡이로 알아서 받아주고 출력해줘서 좋았는데 그만큼 느리군요...

서칭 해보니까 아래 두줄이 입출력 가속하는 거라고 나오던데

그래도 C표준 입출력보다 느리면 cstdio로 그냥 scanf, printf 쓰는게 더 나은가요?

시간을 줄여야 하는 상황이라면

kravi   2년 전

scanf보다 ios_base::sync_with_stdio(false); cin.tie(NULL);을 포함한 cin이 더 빠릅니다. (올려드린 링크 확인좀 해보세요)

빠른 입출력과 관련된 문제(예를 들면 이런 문제)가 아님에도 저 두 줄을 포함한 cin을 사용해서 시간 초과가 난다면, 다른 곳에서 틀린 것입니다.

sync_with_stdio(0)는 scanf와 cin 사이의 동기화를 해제하고, cin.tie(0)은 입력과 출력 사이의 flush를 무시합니다. 

참고로 flush 관련 문제 때문에 cout에서 endl도 쓰시면 안 됩니다. (느립니다)

아래 두 글도 한번씩 읽어보시면 도움이 되실 것 같습니다.

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

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

sc3289   2년 전

꼼꼼히 읽어보겠습니다.

갑자기 동기화 flush 이런 용어들이 나오니까 혼란스럽네요

감사합니다!

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