본문 바로가기
7장 기타/백준 BOJ

[백준/BOJ] 15552번 빠른 A+B (C++)

2021. 5. 3.
 

15552번: 빠른 A+B

첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다.

www.acmicpc.net

문제의 소재

정수 T를 입력받고 T번동 안 A, B를 입력받아 A+B를 출력하는 문제이다.

해답

얼핏보면 10950번 문제와 동일한 문제처럼 보인다. 그러나 T가 1,000,000 이하 자연수이므로 큰 수이면 입출력에 소요되는 시간도 전체 실행시간에 영향을 미친다. 따라서 입출력 이전에 cin.tie(NULL);과 ios::sync_with_stdio(false);를 이용하고, 줄 넘김에 endl 대신 "\n"을 이용하여 입출력 시간을 줄이면 된다.

// BOJ_15552.cpp
#include <iostream>
using namespace std;

int main()
{
    int T, A, B;
    
    cin.tie(NULL);
    ios::sync_with_stdio(false);
    
    cin>>T;
    for (int i=0;i<T;i++)
    {
        cin>>A>>B;
        cout<<A+B<<"\n";
    }
    
    return 0;
}
  • cin.tie(NULL);

cin.tie(NULL);은 cin과 cout의 묶음을 풀어준다. 출력 스트림은 입출력을 하기 전에 자동으로 flush를 하여 버퍼를 비운다. cin이 자주 사용될 경우 버퍼를 계속 비우는데 적지 않은 시간이 소요될 수 있다. 따라서 cin.tie(NULL);을 먼저 호출하면 버퍼를 비우지 않아 시간을 줄일 수 있다. 다만 버퍼를 비우지 않아 여러 가지 문제가 발생할 수 있다.

  • ios::sync_with_stdio(false);

C++은 C에서 사용되던 함수를 이용하여 입출력을 받을 수 있다. 여러가지 입출력을 혼용해서 사용할 경우 안정성을 위해 입출력 버퍼는 동기화되어있다. 입출력을 받을 때 각각의 버퍼에서 같이 입출력이 일어나므로 입출력 횟수가 많아지면 속도에 영향을 줄 수 있다. ios::sync_with_stdio(false);를 사용하여 동기화를 끄면 iostream 표준 스트림과 표준 C 스트림이 독립적으로 작동하여 시간 소요를 줄일 수 있다. 다만 두 스트림의 함수를 섞어서 사용하면 예상치 못한 문제가 발생할 수 있다.

  • endl과 \n

endl과 \n은 모두 줄 넘김을 위해 사용된다. endl은 cout<<endl;으로 \n은 cout<<"\n";과 같이 사용되는 차이가 있다. 그러나 endl은 \n을 출력함과 동시에 버퍼를 비우는 작업을 수행한다. endl의 실행 횟수가 많아지면 매번 버퍼를 비워 실행 시간에 영향을 미친다. endl이 자주 호출될 경우 \n으로 대체하면 실행시간을 줄일 수 있다.

반응형

댓글