injoon2018   2년 전

실제 코딩 대회에서는 언어별로 추가시간과 메모리 최대치가 다르게 주어지나요??

맞은 분들 풀이를 보면 항상 최상위권 분들은 C 혹은 C++을 사용하시고 특정 방식으로만 입출력을 하시더라고요.

코드 작성을 할 때도, 코드 길이를 줄이기 위해 가독성을 포기하시고요.

실제 대회에서도 그렇게 최대한 쥐어짜야하는 것인가요??

대회에 따라 언어별로 제한시간/제한 메모리를 다르게 해주는 경우도 있고 아닌 경우도 있습니다.

카카오 / ACM-ICPC는 제한시간이 동일했고 SCPC는 자바 언어의 경우 제한시간을 조금 더 주었습니다.

입출력의 경우, 의도한 풀이는 printf/scanf는 상관이 없고 cin/cout에서도 ios::sync_with_stdio, cin.tie 이 2가지만 적용해주면 굳이 getchar()를 쓰면서까지 Fast IO를 하지 않더라도 Accepted가 나오게끔 되어있습니다. 그러나 최적의 시간복잡도가 아닌 코드로 속된말로 비빌 때, Fast IO로 조금이라도 입출력 시간을 줄일 시도를 해볼 수 있는거죠.

코드 작성 또한 가독성을 포기하는 것이 일반적인 개발에서는 정말 안 좋은 습관이지만 대회에서는 시간 페널티를 줄이는 것이 중요하기 때문에 사람에 따라 define문을 떡칠한다던가 해서 가독성을 버리더라도 문제를 빠르게 해결하기 위해 코드 길이를 최대한 줄이게끔 합니다. 또 코드 길이가 너무 길면 팀노트에서 옮겨서 타이핑할 때 필요한 시간도 더 필요하니까요.

injoon2018   2년 전

emiyagugizzada //ㅋㅋㅋㅋ 닉 보고 혼자 웃었네요.    ios::sync_with_stdio, cin.tie 이 뭔가요?  입출력 문제 12 번째 문제가 이걸 적용해서 풀어라고 하던데 배운 적이 없어서 그냥 넘어갔네요

ios::sync_with_stdio(false)는 cin / cout에서 사용하는 입출력 버퍼와 scanf / printf에서 사용하는 입출력 버퍼 사이의 동기화를 해제하는 명령입니다. 동기화를 해제하고 나면

cout << "1";

printf("2");

에서 실제 출력 버퍼에 "12"라고 기록될지 "21"이라고 기록될지 확신할 수 없는 반면 cin/cout의 속도는 굉장히 빨라집니다. 그러니 cin/cout만을 사용할 떄에는 동기화를 끄는 것이 좋겠죠. 단 동기화를 끌 경우 cin/cout과 scanf/printf를 섞어쓰면 안됩니다.

cin.tie(NULL)은 cin에서 input을 받아들이기 전에 반드시 cout에서 flushing하는 것을 중지하는 명령입니다. 입/출력버퍼가 전부 한 화면에 포함되는 경우에는 이 명령이 조금이나마 유용할 수 있지만(사실 그렇다고 해도 고작 1-2초 내로 실행되는 프로그램에서 flush를 해주지 않아 메모리상에서 꼬여버릴 가능성은 0에 가깝지만요) 채점 프로그램은 입력 버퍼와 출력 버퍼가 분리되어있기 때문에 전혀 출력 버퍼를 flush해줄 이유가 없습니다. 그렇기 때문에 cin.tie(NULL)로 flush를 중단해 속도를 향상시킬 수 있습니다. 비슷한 맥락으로 줄바꿈을 출력할 때 endl을 지양해야 합니다.

전 제 닉이 굉장히 마음에 안들지만 소소한 행복을 드렸다니 기쁜 일이네요 ^~^

injoon2018   2년 전

친절한 답변 감사드립니다 ㅎㅎ 태풍 오는데 안전 유의하시고 좋은 하루 보내세요~

injoon2018   2년 전

emiyagugizzada //혹시 괜찮으시다면 ios::sync_with_stdio(false); 와 cin.tie(NULL);  를 코드에서 정확히 어떻게 사용해야 하는 것인지 가르쳐 주실수 있나요? 한번 써봤는데 메모리와 속도에서 조금의 차이도 없어서 잘 못 쓴건지 싶네요


Visual Studio에서 실행한거 맞으시죠? VS에서는 해당 기능이 제대로 작동하지 않는걸로 알고있습니다. gcc에서 테스트해보면 확실히 시간 차이가 나는 것을 확인할 수 있습니다.

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