[15552] 빠른 A+B - ios_base::sync_with_stdio(false)와 cin.tie(null)
https://www.acmicpc.net/problem/15552
15552번: 빠른 A+B
첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다.
www.acmicpc.net
문제
본격적으로 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()을 추가로 해 주는 것이 좋다.
또한 입력과 출력 스트림은 별개이므로, 테스트케이스를 전부 입력받아서 저장한 뒤 전부 출력할 필요는 없다. 테스트케이스를 하나 받은 뒤 하나 출력해도 된다.
대체
ios_base::sync_with_stdio(false)
cin.tie(null)
이 무슨 역할을 하는지 모르겠어서 알아봤다
이 둘은 입출력이 빈번하게 일어나는 경우 알고리즘 문제에서 필수적으로 수행해주어야 하는 것들이다!
또한 endl보다는 \n을 사용해야한다.
후자가 더 속도가 빠른데 이는 endl가 수행될때 flush도 함께 수행하여 속도가 \n보다는 느리다
ios_base::sync_with_studio(false)
원래는 c++/c를 동시에 사용할 수 있는 상태인데, c++만 사용하도록 바꾸게 되면서,
원래는 stdio.h와 iostream.h가 버퍼를 공유하고 있는 상태인데, c++만의 독립적인 버퍼처럼 사용되므로 빠르다.
하지만, 그 때문에 멀티스레드 환경에서는 출력순서를 보장할 수 없어 사용하지 않는 것이 좋다!
cin.tie(null)
cin과 cout의 묶음을 해제시켜준다.
cin,cout은 기본적으로 묶여있으며, 묶여있는 스트림 끼리는 각각의 스트림이 IO작업을 수행하기전 자동으로 버퍼를 비워준다.
근데 이를 해제시켜주면, 버퍼를 자동으로 비워주지 않는다.
https://jaimemin.tistory.com/1521
ios_base::sync_with_stdio(false); cin.tie(null); 구문을 추가해주는 이유
C++로 알고리즘을 풀 때 실행 속도를 높이기 위해 흔히 아래와 같은 구문을 작성해줍니다. ios_base::sync_with_stdio(false); cin.tie(null); 저 같은 경우 단순히 시간초과가 발생했을 때 남들이 위 코드를 작
jaimemin.tistory.com
답은 여기
/*
* 백준 - 단계별 문제풀이 : for문
* 15552번
*
* 빠른 A+B
* 두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
*
*/
#include <iostream>
#include <vector>
using namespace std;
int main() {
// 입출력이 빈번하게 일어나는 경우 다음을 따르면 빨라진다. (실제로는 x,알고리즘 풀때)
// 1. endl 대신 "\n" 사용
// 2.
cin.tie(NULL); //cin , cout의 묶음을 풀어줌
ios_base::sync_with_stdio(false); //c, c++버퍼를 분리
vector<int> v;
int n, a, b;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a >> b;
v.push_back(a + b);
}
for (int i = 0; i < n; i++) {
cout << v[i] << "\n";
}
}