문제는 다음과 같습니다.
https://www.acmicpc.net/problem/15552
15552번: 빠른 A+B
첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다.
www.acmicpc.net
풀이 코드는 다음과 같습니다.
#include <iostream>
using namespace std;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n,a,b;
cin>>n;
for(int i{0};i<n;i++)
{
cin>>a>>b;
cout<<a+b<<"\n";
}
return 0;
}
다른 점은 메인 함수에서
ios_base::sync_with_stdio(false)
cin.tie(NULL) 이라는 명령어가 추가되었습니다.
사실 C언어 C++에서 scanf , printf를 사용한다면 두 함수의 처리 속도가 빠르기 때문에 큰 문제를 일으키지 않지만 cin , cout , endl 과 같은 명령어를 사용하면 시간초과에 걸리게 됩니다.
그래서 두 줄의 코드를 추가해주었는데,
ios_base::sync_with_stdio(false)는 C++과 C언어의 표준 스트림 동기화를 해제하는 역할을 합니다.
C++과 C언어는 서로 스트림이 연결되어 있어서 scanf를 사용하다가 출력을 cout으로 하는 것이 가능하지만 이는 당연히 처리속도가 느려지는 단점을 가지고 있습니다.
이를 해제하게 되면 처리 속도가 빨라지게 됩니다. 단 , 두 가지의 방식을 혼용하여 사용하는 것이 불가능해지기 때문에 하나의 방식으로 코드를 짜야합니다.
cin.tie(NULL) 은 입출력 연동을 해제하는 명령어입니다.
for문에서 cout 이후 cin을 사용하면 cout -> cin-> cout -> cin 순으로 계속해서 버퍼를 이전에 출력한 작업을 비우는 일을 합니다. 이를 해제하여 버퍼를 비우는 시간을 절약할 수 있습니다.
단, 이 방법은 cout -> cout -> cout ... ->cin ->cin 이런 식 또는 cin -> cin -> cin -> ... -> cout -> cout -> cout 방식으로 처리하게 됩니다.
endl을 사용하지 않고 \n을 사용하는 것 역시 cin.tie(NULL) 과 같이 버퍼를 비우는 시간을 없에기 위해 사용됩니다.
따라서 두 명령어를 입력하고 endl을 사용하지 않고 \n을 사용하면 이번 문제를 해결할 수 있습니다.
'백준 문제풀이' 카테고리의 다른 글
1550번 : 16진수 (0) | 2022.05.19 |
---|---|
2914번 : 저작권 (0) | 2022.05.19 |
2775번 : 부녀회장이 될테야 (0) | 2022.05.18 |
11399번 : ATM (0) | 2022.05.12 |
2475번 : 검증수 (0) | 2022.05.12 |