요즘 백준을 풀면 시간초과 문제로 나날이 스트레스를 받고 있었는데,
시간초과와 관련된 좋은 문제가 있어서 풀어보았다.

https://www.acmicpc.net/problem/15552
일반적으로 c++에서 cin/cout이 scanf/printf보다 속도가 느린다고 한다.
endl을 이용하는 것보다, '\n'을 통해 줄바꿈을 하는 것이 빠르다고 한다.
(endl은 개행문자를 출력할 뿐 아니라 출력 버퍼를 비우는 역할까지 하기때문에 출력 한 뒤 화면에 바로 보이게 할 수 있다. 하지만 이렇게 버퍼를 비우는 작업이 매우 느리다고 한다. 그래서 endl을 '\n'으로 바꾸어주어 시간 향상을 이루어내는 것이라고 한다.)
cin.tie(NULL)은 cin과 cout의 묶음을 풀어 준다. 기본적으로 cin으로 읽을 때 먼저 출력 버퍼를 비운다. 입력과 풀력을 여러 번 번갈아서 반복해야 하는 경우 필수적이라고 한다.
ios_base::sync_with_stdio(false)는 C와 C++의 버퍼를 분리한다. 이것을 사용하면 cin/cout이 더이상 stdin/stdout과 맞춰 줄 필요가 없으므로 속도가 빨라진다고 한다. 단, 버퍼가 분리되었기때문에 cin과 scanf, gets, getchar등을 같이 사용하면 안되고, cout과 printf, puts, putchar등을 같이 사용하면 안 된다고 한다.

(출처 : https://www.acmicpc.net/board/view/22716)
이 사이트에 멋진분께서 잘 정리해주셨다.
#include <iostream>
using namespace std;
int main(void)
{
cin.tie(NULL);
ios_base::sync_with_stdio(false);
int tc;
cin>>tc;
for (int i=0; i<tc; i++){
int x, y;
cin>>x>>y;
cout<<x+y<<'\n';
}
return 0;
}

결과가 정말 신기하다.
여태까지는 하나하나 입력이 들어가는대로 출력을 했는데,
이 코드에서는 입력을 모두 받은 뒤 출력을 진행했다.
작년에 데이터구조를 배우면서 지나언니가 버퍼에대해 설명해줬는데
그게 이렇게 쓰이는구나 !
덕분에 이해 쏙쏙이다.
아직 알아야하는게 많구나...
파 이 팅 !ㅠ