백준 15552번 [ 빠른 A+B ]

홍수민·2023년 1월 28일
0

BAEKJOON이다

목록 보기
11/18

https://www.acmicpc.net/problem/15552

나는 C++로 계속 문제를 풀고 있기 때문에

cin.tie(NULL);
ios_base::sync_with_stdio(false);

이 아이들을 사용해주어야 한다. 그치만 얘네들을 모르는 상태로 문제를 풀 수는 없었기에(ㅠㅠ) 조금 찾아보았다!!

1. endl 대신 "\n"

우선 "\n"는 개행문자를 출력하는 역할을 한다. 그런데 endl은 여기에다가 출력 버퍼를 비우는 역할까지 하기 때문에 시간이 많이 든다고 한다. 이를 '버퍼플러시'라고 하는데, 임시저장 영역에서 컴퓨터의 영구 메모리로 컴퓨터 데이터를 전송하는 것을 의미한다. 당연히 버퍼플러시를 안 하는 게 시간이 덜 들 것이고, 문제를 빠르게 풀어야 하는 코딩테스트에서도 버퍼플러시가 들어있지 않은 "\n"을 쓰는 것이 좋다.

2. cin.tie(NULL)

C++에서는 cin과 cout의 스트림 버퍼를 공유하고 있다. 이게 무슨 말이냐면 cin을 사용할 때 cout의 버퍼를 지워주고, cout를 사용할 때 cin의 버퍼를 지워준다는 것이다. 그런데 cin.tie(NULL)은 cin과 cout의 묶음을 풀어주는 역할을 한다. cin을 사용할 때 cout의 버퍼를 지우지 않아도 되는 것이다. 결국 입출력이 독립적인 버퍼를 사용하면서 시간의 효율성을 높이게 된다.

3. ios_base::sync_with_stdio(false)

이 코드가 없다면 C의 표준 스트림 버퍼와 C++의 표준 스트림 버퍼를 같이 사용할 수 있다. cin, scanf, gets, getchar 등과 cout, printf, puts, putchar 모두 사용 가능한 것이다. 이거는 장점으로 작용하기도 하지만, 버퍼를 같이 쓰기 때문에 속도가 느려진다는 단점이 있다. 그래서 ios_base::sync_with_stdio(false)을 활용함으로써 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";
  }
}
profile
수만이다

0개의 댓글