Q

백준 15552

백준 15552번 문제


C code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>

int main(void)
{
int a, b, t;

scanf("%d", &t);

for(int i = 0; i < t; i++)
{
scanf("%d %d", &a, &b);
printf("%d\n", a+b);
}

return 0;
}

short code

1
main(a,b,t,i){scanf("%d",&t);for(i=0;i<t;i++){scanf("%d %d",&a,&b);printf("%d\n",a+b);}}

C++ Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;

int main(void)
{
cin.tie(NULL);
ios_base::sync_with_stdio(false);

int t, a, b, sum = 0;

cin >> t;

for(int i = 0; i < t; i++)
{
cin >> a >> b;
cout << a + b << '\n';
}

return 0;
}

Note

  • 알고리즘 문제를 풀 때 아래의 구문들은 수행 속도면에서 퍼포먼스를 향상시키기 위함이다.

ios_base::sync_with_stdio(false)

기본적으로 C++와 C의 표준 스트림은 동기화 되어 있기 때문에 C++ 파일에 C++ 및 C 문법 각각의 입출력 스타일(cin, scanf, cout, printf)대로 적어도 알아서 동기화에 의해 C와 C++이 동일한 버퍼를 공유하여 입출력 결과를 순서대로 출력한다.

하지만 동기화를 하므로 딜레이가 발생하여 속도면에서 퍼포먼스가 떨어지게 되는데

위의 문장을 통해 동기화를 끊으면 C++ 파일에 C 문법의 입출력 함수는 사용하지 못하게 된다.

즉, 쉽게 말해 평소에는 C의 stdio와 C++의 iostream이 동기화 되어 있는데, 위의 문장을 이용해 동기화를 비활성화 해줌으로써 많은 양의 입출력을 처리하는 데 있어 퍼포먼스를 증가시킬 수 있다.

알고리즘 문제 풀 때는 예외 처리나 멀티스레드 작업이 필요없으므로 많이 사용한다.

cin.tie(NULL)

기본적으로 cin과 cout, 입출력은 묶여있는데, 이 말은 입력 요청이 들어왔을 때 이전에 작업하던 출력 작업이 있으면 출력 버퍼에 있는 것을 비워서 화면에 출력하고, 입력을 받는다는 것이다.

즉, 입력 요청이 들어오면 출력 버퍼를 비우고 입력을 받기 때문에 딜레이가 걸리게 된다.

하지만 위의 문장을 이용해 입력과 출력의 연결을 끊어줌으로써, 한 번에 입력을 다 받고, 출력을 한 번에 하게 되는 현상을 실현할 수 있다.

주의할 점은 입출력 순서를 보장받을 수 없다는 것이다.

endl

endl은 개행도 해주지만, 출력 버퍼를 비우는 작업도 해준다.

위의 cin.tie(NULL)도 쓰고, endl도 같이 쓰면, cin.tie(NULL)에 의해 입출력의 묶음을 풀어줌으로써 한 번에 입력을 받고 나중에 한 번에 출력 버퍼를 지우려는 목적이 endl에 의해 효과를 볼 수 없게 된다.

즉, cin.tie(NULL) 문장이 무력화되므로, ‘\n’을 사용해주는 것이 좋다.

cin.tie(NULL)과 ios_base::sync_with_stdio(false) 그리고 endl
https://ip99202.github.io/posts/%EC%9E%85%EC%B6%9C%EB%A0%A5-%EC%86%8D%EB%8F%84-%EC%A4%84%EC%9D%B4%EA%B8%B0/
https://jaimemin.tistory.com/1521