Coding Test/Baekjoon

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

예롱메롱 2024. 1. 26. 01:01
728x90
반응형
 

15552번: 빠른 A+B

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

www.acmicpc.net


 

📌 접근 방법

  • C로는 시간초과 없이 풀 수 있었지만 C++로는 시간초과가 났다.
    • 입출력에 관한 지식이 더 필요할 것 같다.
    • C언어 : scanf(), printf()를 사용해서 빠르게 문제를 해결 가능
    • C++ : cin, cout를 이용하면서 시간초과가 발생

✔ 해결 방법

 

1. C++와 C 표준 스트림의 동기화 해제

ios::sync_with_stdio(false);

 

  • C++에서는 C++과 C의 표준 스트림이 동기화 되어있음 (동일한 버퍼를 공유)
  • 이런 동기화 상태가 성능을 저하시키지만, 매우 합리적이고 스레드로부터 안전하기 때문에 동기화 상태로 두는 것이 올바른 방법
    ➡ 알고리즘 문제 풀이에서는 예외 처리나 멀티스레드 작업을 필요로 하지 않기 때문에 두 동기화를 끊어줘도 됨!
    성능이 많이 좋아짐
  • 동기화를 끊어주면 C, C++  중 하나의 스타일을 써야 함(혼용 X)


2. 입력과 출력 연결을 끊기 

cin.tie(NULL);
cin.tie(nullptr), cin.tie(0)
  • 두 방법 중 하나를 택하면 됨
  • 기본적으로 입력과 출력은 연결되어 있음!  ➡ 이것을 끊어주는 것
    • 입력 요청이 들어오면 그 전에 출력 버퍼에 내용이 있었을 경우 버퍼를 비워주고 출력(flush)

 

 

3. endl 대신 '\n'사용

  • endl은 줄바꿈만 해주는 것이 아니라 출력 버퍼를 비워줌(flush)
    ➡ 위에서 사용한 방법인 tie를 끊어주는 효과
    • 매 번 출력할 필요가 없으니 자주 버퍼를 비울 필요가 없음
    • 성능 낭비

 

⚡ 다른 방법
C 표준 입출력 stdio.h 사용해도 됨
➡ 하지만 iostream 사용할 것임

 

 

✅  Pass Code

#include<iostream>
using namespace std;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    int T;
    cin>>T;
    int A,B;
    for(int i=0; i<T; i++){
        cin>>A>>B;
        cout<<A+B<<'\n';
    }
    return 0;

}

 

 

728x90
반응형