백준

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

슬뷔 2023. 12. 20. 16:10

 

내 답안 -> 시간초과

#include <iostream>
using namespace std;

int main()
{
    int T, a, b;

    cin >> T;

    for (int i = 0; i < T; ++i)
    {
        cin >> a >> b;

        cout << a + b << "\n";
    }

    return 0;
}

 

문제 발생 이유

C언어, C++의 경우 scanf(), printf()를 사용한다. 이 경우 입출력 자체가 매우 빨라 쉽게 통과한다. 그러나 C++의 standard 입출력 cin, cout을 사용하면 시간 초과가 난다.

 

이 문제를 푸는 첫 번째 방법은 C표준 입출력 stdio.h를 쓰는 것이다.
stdio.h로 풀면 간단하게 해결 된다.


나는 iostream으로 풀어보고자 한다.

iostream으로 cin, cout만 쓰면 시간초과가 뜬다.

 

stdio.h와 다르게 왜 느릴까?!

  • C++은 C의 표준 스트림이 동기화되어있다. 즉, 동일한 버퍼를 공유한다.
  • 동기화 => 성능⬇ / 합리적, 안전도 ⬆
    ex1. std::cin =동기화=> stdin
    ex2. std::out =동기화=> stdout

 

해결 방안

동기화를 끊어주어야 한다.

https://travelerfootprint.tistory.com/121

 

백준 알고리즘 15552번: 빠른 A+B [C++]

문제 출처: www.acmicpc.net/problem/15552 15552번: 빠른 A+B 첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다. ww

travelerfootprint.tistory.com

https://st-lab.tistory.com/232

 

[백준] 15552번 : 빠른 A+B - [C++]

www.acmicpc.net/problem/15552 15552번: 빠른 A+B 첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다. www.acmicpc.net

st-lab.tistory.com

  • 알고리즘 문제 풀이는 두 동기화를 끊어주어도 OK
  • 동기화를 끊으면 => C++표준 스트림이 독립적으로 IO 버퍼링
  • 이를 위해 ios_base에 있는 sync_with_stdio()를 활용! (파라미터는 false를 해줄 때 동기화 해제)
  • 단, 동기화를 해제 했기때문에 C와 C++ 스타일 중 하나를 선택해서 써야 한다.
cin.tie(NULL);
  • 메인 함수 첫 줄에 선언
  • cin과 cout 묶음을 풀어주는 구문
  • cin으로 데이터를 읽을 때 출력 버퍼에 있는 내용을 비우는데 비우지 않고 먼저 입력
ios_base::sync_with_stdio(false);
  • C와 C++버퍼 분리 역할

 

풀이

#include <iostream>
using namespace std;

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

    int T, a, b;

    cin >> T;

    for (int i = 0; i < T; ++i)
    {
        cin >> a >> b;

        cout << a + b << "\n";
    }

    return 0;
}

'백준' 카테고리의 다른 글

[백준 C++] 1271번 엄청난 부자2  (1) 2024.01.04
[백준 C++] 10951번 A+B -4  (1) 2023.12.20
[백준 C++] 2480번 주사위  (0) 2023.12.20
[C++ 백준] 2525번 오븐 시계  (0) 2023.12.20
[백준 C++] 11382번 꼬마 정민  (0) 2023.12.19