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
'알고리즘 > 개념정리' 카테고리의 다른 글
알고리즘(C++) / 문자 대소문자 판별, 숫자 판별, 공백 판별 (0) | 2021.08.04 |
---|---|
알고리즘(C++) / 벡터(vector) 중복제거 : unique (0) | 2021.07.01 |
알고리즘 / unordered_map (0) | 2021.06.26 |
알고리즘 / DFS(Depth First Search), BFS(Breath First Search) (0) | 2021.04.10 |
알고리즘 / 그리디 알고리즘(탐욕 알고리즘) (0) | 2021.03.01 |
댓글