Baekjoon 15552 빠른 A+B

배혜진·2023년 2월 1일

Baekjoon

목록 보기
1/9

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

[문제]


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;
}

[돌아보며]

결과가 정말 신기하다.
여태까지는 하나하나 입력이 들어가는대로 출력을 했는데,
이 코드에서는 입력을 모두 받은 뒤 출력을 진행했다.

작년에 데이터구조를 배우면서 지나언니가 버퍼에대해 설명해줬는데
그게 이렇게 쓰이는구나 !
덕분에 이해 쏙쏙이다.

아직 알아야하는게 많구나...
파 이 팅 !ㅠ

profile
HYU🦁 Information System 22✨

0개의 댓글