✔ Online Judge
[C++] 백준 10871 X보다 작은 수
근본없는 개발자
2023. 6. 9. 20:23
// 풀이 1
#include <iostream>
using namespace std;
int main() {
int n, x, tmp, cnt=0;
int arr[10000];
cin >> n >> x;
for (int i = 0; i < n; i++) {
cin >> tmp;
if (tmp < x) arr[cnt++] = tmp;
}
for (int i = 0; i < cnt; i++) {
cout << arr[i] << ' ';
}
return 0;
}
// 풀이 2
#include <iostream>
using namespace std;
int main() {
// 아래 주석부분을 넣어주지 않는다면 속도가 느리다!
//ios::sync_with_stdio(0);
//cin.tie(0);
//cout.tie(0);
int n, x, tmp, cnt = 0;
cin >> n >> x;
for (int i = 0; i < n; i++) {
cin >> tmp;
if (tmp < x) cout << tmp << ' ';
}
return 0;
}
✔️ cin/cout의 tie에 따른 속도 차이
① 발생한 문제
. 당연히 풀이 2번이 빠를거라고 생각했는데, 제출하고 보니 1번이 훨씬 빠르게 되서 의문점을 갖게 되었다.
② 원인
. 기본적으로 C++에서 cin과 cout은 tie되어 있습니다.
. 입력과 출력이 동기화 되어있기 때문에, cout 후에 cin 하게 되면, 출력을 먼저 하고 입력을 받게 됩니다.
. 이 동기화 때문에 cin에서 입력을 받게 되면 cout은 버퍼를 비워야 합니다.
→즉, 이 버퍼를 비우는 작업이 매우 느리기 때문에, tie를 끊지 않은 상태에서 풀이2번처럼 입출력을 번갈아서 하게 되면 매번 버퍼를 비우므로 엄청나게 느려지게 되는 것 입니다.
③ 해결
. 다행히 C++은 tie에 대한 설정을 할 수 있는 함수를 제공합니다.
. cout.tie(), cin.tie()가 그 함수인데, 인자로 NULL을 넣어주게 되면 아무 스트림과도 tie를 하지 않겠다는 의미가 되어 cin과 cout은 서로에게 영향을 주지 않고 빠르게 작동할 수 있습니다.