내 답안 -> 시간초과
#include <iostream>
using namespace std;
int main()
{
int T, a, b;
cin >> T;
for (int i = 0; i < T; ++i)
{
cin >> a >> b;
cout << a + b << "\n";
}
return 0;
}
문제 발생 이유
C언어, C++의 경우 scanf(), printf()를 사용한다. 이 경우 입출력 자체가 매우 빨라 쉽게 통과한다. 그러나 C++의 standard 입출력 cin, cout을 사용하면 시간 초과가 난다.
이 문제를 푸는 첫 번째 방법은 C표준 입출력 stdio.h를 쓰는 것이다.
stdio.h로 풀면 간단하게 해결 된다.
나는 iostream으로 풀어보고자 한다.
iostream으로 cin, cout만 쓰면 시간초과가 뜬다.
stdio.h와 다르게 왜 느릴까?!
- C++은 C의 표준 스트림이 동기화되어있다. 즉, 동일한 버퍼를 공유한다.
- 동기화 => 성능⬇ / 합리적, 안전도 ⬆
ex1. std::cin =동기화=> stdin
ex2. std::out =동기화=> stdout
해결 방안
동기화를 끊어주어야 한다.
https://travelerfootprint.tistory.com/121
https://st-lab.tistory.com/232
- 알고리즘 문제 풀이는 두 동기화를 끊어주어도 OK
- 동기화를 끊으면 => C++표준 스트림이 독립적으로 IO 버퍼링
- 이를 위해 ios_base에 있는 sync_with_stdio()를 활용! (파라미터는 false를 해줄 때 동기화 해제)
- 단, 동기화를 해제 했기때문에 C와 C++ 스타일 중 하나를 선택해서 써야 한다.
cin.tie(NULL);
- 메인 함수 첫 줄에 선언
- cin과 cout 묶음을 풀어주는 구문
- cin으로 데이터를 읽을 때 출력 버퍼에 있는 내용을 비우는데 비우지 않고 먼저 입력
ios_base::sync_with_stdio(false);
- C와 C++버퍼 분리 역할
풀이
#include <iostream>
using namespace std;
int main()
{
cin.tie(NULL);
ios_base::sync_with_stdio(false);
int T, a, b;
cin >> T;
for (int i = 0; i < T; ++i)
{
cin >> a >> b;
cout << a + b << "\n";
}
return 0;
}
'백준' 카테고리의 다른 글
[백준 C++] 1271번 엄청난 부자2 (1) | 2024.01.04 |
---|---|
[백준 C++] 10951번 A+B -4 (1) | 2023.12.20 |
[백준 C++] 2480번 주사위 (0) | 2023.12.20 |
[C++ 백준] 2525번 오븐 시계 (0) | 2023.12.20 |
[백준 C++] 11382번 꼬마 정민 (0) | 2023.12.19 |