본문 바로가기
알고리즘/개념정리

알고리즘(C++) / cin, cout 입출력 속도 높이기

by clean_h 2021. 4. 10.
728x90

백준 2751문제를 풀 때 입력과 출력은 맞게 나오는데 결과는 시간 초과라는 결과가 나왔다.

알아본 결과 cin과 cout을 사용할 때 시간이 상당히 걸린다는 것을 알았다.

그래서 cin과 cout의 입출력 속도를 높여 다시 구현해보았다.

 

cin과 cout의 입출력 속도를 높이기 위해 다음 줄을 추가해주면 된다.

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

일종의 편법이지만 이 방법을 사용하면 cin과 cout의 속도를 높일 수 있다.

 

하지만 주의할 점이 있다.

  • scanf,printf와 섞어 사용 X
  • 싱글 쓰레드 환경에서만 사용

다음과 같은 점만 주의해주면 코드를 작성하는데 문제가 없다. 

 

또한 추가로 endl을 사용하는 것보다는 "\n"을 사용하는 것이 속도를 더 높일 수 있다고 한다. 

 

 


 

속도가 얼마나 달라지는지 백준 2751문제를 예시로 확인해보겠다. 

1. cin,cout, endl 사용

//2751 수 정렬하기 2
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int main() {
	int N;
	cin >> N;

	vector <int> vec;

	int num;
	for (int i = 0; i < N; i++) {
		cin >> num;
		vec.push_back(num);
	}

	sort(vec.begin(), vec.end());

	for (int i = 0; i < N; i++) {
		cout << vec[i] << endl;
	}
	
	return 0;
}

시간 초과

 

2. 속도 높이는 코드 추가

//2751 수 정렬하기 2
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

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

	int N, num;
	cin >> N;

	vector <int> vec;

	for (int i = 0; i < N; i++) {
		cin >> num;
		vec.push_back(num);
	}

	sort(vec.begin(), vec.end());

	for (int i = 0; i < N; i++) {
		cout << vec[i] << "\n";
	}
	
	return 0;
}

 

3. scanf, printf 사용

//2751 수 정렬하기 2
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int main() {

	int N, num;
	scanf("%d", &N);

	vector <int> vec;

	for (int i = 0; i < N; i++) {
		scanf("%d", &num);
		vec.push_back(num);
	}

	sort(vec.begin(), vec.end());

	for (int i = 0; i < N; i++) {
		printf("%d\n", vec[i]);
	}
	
	return 0;
}


3가지 경우 중

cin, cout 속도 높이는 코드 추가 > scanf, printf > cin, cout

순으로 코드의 속도가 빠르다.

 

내가 코드를 구현할 때 scanf와 printf보다는 cin과 cout 자주 사용하는 경향이 있어 cin과 cout을 사용할 때는 다음 코드를 꼭 추가해주어야할 거 같다. 

728x90

댓글