별의 공부 블로그 🧑🏻‍💻
728x90
728x170

문제

본격적으로 for문 문제를 풀기 전에 주의해야 할 점이 있다. 입출력 방식이 느리면 여러 줄을 입력받거나 출력할 때 시간초과가 날 수 있다는 점이다.

C++을 사용하고 있고 cin/cout을 사용하고자 한다면, cin.tie(NULL) sync_with_stdio(false)를 둘 다 적용해 주고, endl 대신 개행문자(\n)를 쓰자. 단, 이렇게 하면 더 이상 scanf/printf/puts/getchar/putchar 등 C의 입출력 방식을 사용하면 안 된다.

Java를 사용하고 있다면, Scanner System.out.println 대신 BufferedReader BufferedWriter를 사용할 수 있다. BufferedWriter.flush는 맨 마지막에 한 번만 하면 된다.

Python을 사용하고 있다면, input 대신 sys.stdin.readline을 사용할 수 있다. 단, 이 때는 맨 끝의 개행문자까지 같이 입력받기 때문에 문자열을 저장하고 싶을 경우 .rstrip()을 추가로 해 주는 것이 좋다.

또한 입력과 출력 스트림은 별개이므로, 테스트케이스를 전부 입력받아서 저장한 뒤 전부 출력할 필요는 없다. 테스트케이스를 하나 받은 뒤 하나 출력해도 된다.

자세한 설명 및 다른 언어의 경우는 이 글에 설명되어 있다.

이 블로그 글에서 BOJ의 기타 여러 가지 팁을 볼 수 있다.

 

 

입력

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

 

 

출력

각 테스트케이스마다 A+B를 한 줄에 하나씩 순서대로 출력한다.

 

 

예제 입력 1

 5

 1 1

 12 34

 5 500

 40 60

 1000 1000

 

예제 출력 1

 2

 46

 505

 100

 2000

 

 

시간 제한 안내

아래 적혀있지 않은 시간 제한은 언어 도움말에 적혀있는 기준을 따른다.

  • Java: 1.5초
  • Java (OpenJDK): 1.5초

 

 

코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#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;
}





cin/cout을 사용하는 경우


cin.tie(NULL);ios_base::/sync_with_stdio(false); 를 추가하고 endl 대신 개행문자('\n')을 쓰면 입출력 속도를 늘릴 수 있다.

단, 이 때 scanf/printf/puts/gets/getchar 등 C의 입출력 방식을 사용하면 안 된다.


C++로 알고리즘 문제를 풀 때 시간을 절약하기 위해 printf, scanf를 사용하는 경우가 많은데, 이 방법을 쓰면 그렇게 하지 않아도 된다.

위의 코드는 cout, cin의 성능을 printf, scanf만큼 빠르게 만들어주는 역할을 한다.


코드에 대한 설명


 ios::sync_with_stdio(false);

 ios::sync_with_stdio는 cpp의 iostream을 c의 stdio와 동기화시켜주는 역할을 한다. 

 이는 iostream, stdio의 버퍼를 모두 사용하기 때문에 딜레이가 발생하게 된다. 

 ios::sync_with_stdio(false)는 이 동기화 부분을 끊는 함수이다. 

 이를 사용하면 c++만의 독립적인 버퍼를 생성하게 되고 c의 버퍼들과는 병행하여 사용할 수 없게 된다. 

 대신 사용하는 버퍼의 수가 줄어들었기 때문에 속도는 높아지게 된다.


 cin.tie(NULL)은 cin과 cout의 묶음을 풀어 준다. 기본적으로 cin으로 읽을 때 먼저 출력 버퍼를 비우는데, 마찬가지로 온라인 저지에서는 화면에 바로 보여지는 것이 중요하지 않다. 입력과 출력을 여러 번 번갈아서 반복해야 하는 경우 필수적이다.

 cin.tie(NULL); 

 디폴트는 cout,cin이 tie되어 있다.

 만약 cout << "hi"; cin >> name; 이 순서라면 디폴트의 경우 "hi"가 먼저 출력되고 name을 입력할 것이다.  

 그러나 untie의 경우엔 cout으로부터 cin을 untie해주기 때문에 먼저 입력부터 받게 된다.

 그러나 "hi"는 보이지 않는데, cout은 디폴트에서는 출력명령을 내리거나 버퍼가 가득찼을 경우에만 flushed되고 출력되기 때문이다.

 따라서 cin을 cout에서 untie하고 싶다면 cin으로 입력하기 전에 cout으로 출력을 할 때마다 지속적으로 flush를 해줘야 한다.


 ios_base::sync_with_stdio(false)는 C와 C++의 버퍼를 분리한다. 이것을 사용하면 cin/cout이 더 이상 stdin/stdout과 맞춰 줄 필요가 없으므로 속도가 빨라진다. 단, 버퍼가 분리되었으므로 cin과 scanf, gets, getchar 등을 같이 사용하면 안 되고, cout과 printf, puts, putchar 등을 같이 사용하면 안 된다.


코드에 관한 내용 출처 http://codecollector.tistory.com/381https://www.acmicpc.net/board/view/22716

728x90
그리드형(광고전용)
⚠️AdBlock이 감지되었습니다. 원할한 페이지 표시를 위해 AdBlock을 꺼주세요.⚠️
starrykss
starrykss
별의 공부 블로그 🧑🏻‍💻


📖 Contents 📖