풀이법은 맞는데 계속 시간 초과가 나서 뭔가 했는데
endl이 문제였다.
endl은 flush를 겸하기 때문에 매우 매우 매우 매우 매우 느립니다. '\n'을 대신 사용하세요.
항상 flush를 해서 느린 c++ endl
1 버퍼의 내용을 모두 지운다.
2 버퍼의 내용을 모두 처리한다.
(여기서 처리한다는 그냥 버리는게 아니다)
stream에서 어딘가로 written을 한다. 그리고 내부적으로는 버퍼로 구현된. 이라는 게 눈에 들어옵니다.
endl을 만난 경우에, '\n'을 추가하고, flush를 하는데요.
버퍼링 정책이 버퍼가 꽉 찼을 때 출력하는 정책이라 해도, endl을 넣으면 강제로 flush가 됩니다. 이게 얼마나 큰 차이냐. 라고 다시 되물으신다면, 위에서 strace 한 결과를 보여드렸으니, 생략해도 될 듯 싶습니다. 요약하면, 개행을 출력하기 위해서 endl을 쓰기 보다는 '\n'을 쓴다. 정도로만 보시면 되겠습니다.
실행 결과는?
문자열만 입력받아버리고 프로그램이 끝나버린다.
원인은
scanf("%s", string);
가 실행되고 나서 입력버퍼에는 개행문자가 그대로 남아있는 거다.
그래서
scanf("%c", &c);
를 실행하려고 보니 버퍼에 개행문자가 있어서 그걸 c에다 넣어버린거다.
정작 표준입력으로는 아무것도 입력안했는데
예전에 이걸 몰라서 개고생한거 생각하면..
해결방법은
입력버퍼를 비우면 된다.
어떻게?
scanf("%s", string);
scanf("%c", &c);
이 두 사이에 입력버퍼를 비워주는 뭔가를 해주면 된다.
1. 간단하게는 getchar(); 를 추가하는 걸로도 가능
2. fflush(stdin); 추가
그런데 이건 gcc에서 안돌아간다. 왜? 당연히 안된다. 표준 fflush함수는 출력버퍼를 비우는 녀석이다.
VC에서는 확장해서 사용하므로 동작하지만 gcc는 안된다.
'Algorithm > Etc' 카테고리의 다른 글
다익스트라(Dijkstra) 알고리즘 (0) | 2021.07.16 |
---|---|
순열 알고리즘 (Permutation Algorithm) (0) | 2021.07.01 |
지도에서 DFS, BFS (0) | 2021.06.09 |
Deque (0) | 2021.05.21 |
DP 하면서 틀리는 것 / DFS하면서 틀리는 것 (0) | 2021.05.11 |