어제의 나보다 성장한 오늘의 나

[C++][코딩테스트] 시간 부족 문제 해결 꿀팁 정리( endl , ios_base::sync_with_stdio(false) , cin.tie(NULL) , cout.tie(NULL) ) 본문

c++/백준 문제 풀이

[C++][코딩테스트] 시간 부족 문제 해결 꿀팁 정리( endl , ios_base::sync_with_stdio(false) , cin.tie(NULL) , cout.tie(NULL) )

today_me 2022. 7. 1. 18:54
반응형

알고리듬 문제를 풀 때 시간이 굉장히 중요한데요

당연 시간 복잡도가 적게 드는 알고리듬을 선택하는 것이 관건이지요.

 

하지만 그 외에도 실행 시간을 줄여주는 꿀팁들이 있습니다.

이것 들을 습관화 해서 더 좋은 코드들로 발전 시켜 봅시다.

 

 

※ 참고 : C++에서의 팁입니다.

 


 

 

 

1) endl 대신 \n 사용

 

 

cout 을 해줄 때 다들 endl을 많이들 사용하시는데요.

endl은 개행 문자 출력 + 버퍼 비우기 를 시행하기 때문에 시간이 더 많이 걸립니다.

 

 

 

cout << "Yes" << endl;

 

 

보다는

 

 

cout << "Yes\n";

 

 

이렇게 \n을 사용해주는 습관을 길러봅시다.

 

 

 

 

2) ios_base::sync_with_stdio(false);

 

 

 

이 코드는 c와 c++의 스트림들(iostram 과 stdio)의 동기화를 false 로 바꿔 준다.

 

쉽게 말하면 이 구문을 통해 c, c++의 스트림들이 독립된 버퍼를 가지게 되어 c와 c++ 스타일을 같이 사용하면 예상치 못한 결과가 나올 수 있다는 것이다.

 

 

따라서 c++만을 사용할 때....그러니까 c의 printf , scanf 등을 사용하지 않을 때!!

 

사용 해주면 된다.

 

 

 

'근데 왜 쓰는가?  오히려 위험해 지는 것 아니냐' 라고 생각 하실 수 있는데 독립된 버퍼를 사용하기 때문에 버퍼가 가벼우니 속도가 훨씬 빨라진다.

 

 

 

Code

 

int main(void){
	
    ios_base::sync_with_stdio(false);
	
    cout << "Yes\n";
}

 

 

 

 

 

3)  cin.tie(NULL) ; cout.tie(NULL);

 

 

 

2)의 ios_base::sync_with_stdio(false) 와 함께 많이 사용되는 코드이다.

 

개념이 조금 비슷하다.

 

cin과 cout은 원래 묶여서 사용된다.

묶여 있는 경우 cin의 경우 버퍼를 비워주기 + 입력 받기 두 가지의 역할을 수행해야만 한다.

 

 

예를 들어

 

string s= "Yes";

cout << s;
cin >> s;

 

 

이런 코드가 있을 때

cout 을 통해 버퍼에 s가 들어간다.

 

cin을 통해 s에 입력을 받으려 한다.

버퍼가 차있기 때문에 버퍼에 있는 것이 먼저 출력되고 cin을 통해 입력을 받는다.

 

 

이렇게 cin의 경우 cout 과 묶여 있으면 두 번의 일을 하게 된다.

 

 

매번 이렇게 실행 중간에 출력을 해줄 필요가 없다..! 하시면

cin과 cout을 분리 시키는 것이 버퍼를 매번 비워주지 않아도 되기 때문에 훨씬 빠르다.

 

 

특히 코딩 테스트나 알고리듬 문제를 풀 때는 실행 중간에 출력이 필요하지 않다.

그러므로 코딩 테스트 , 알고리듬 문제 풀이 때는 분리 시켜서 사용하는 것이 속도 향상에 도움이 된다.

 

 

 

 

Code

 

int main(void){

	cin.tie(NULL); 
	cout.tie(NULL);

}

 

 

 

 

 

 

1) 2) 3) 같이 사용

 

int main(void){

	cin.tie(NULL); cout.tie(NULL);
	ios_base::sync_with_stdio(false);

	cout << "Yes\n";

}

 

반응형
Comments