1. 문제 상세
https://www.acmicpc.net/problem/15552

2. 문제 접근
문제 자체는 문제 10950번 A+B - 3 과 동일 하다.
다만 이번에는 조건에서 cin.tie(NULL) 과 ios_base::sync_with_stdio(false); 을 사용해야 한다.
또한 endl 대신 '\n' 개행문자를 사용해야 한다.
위의 조건을 하나씩 알아보자.
■ cin.tie(NULL);
묶여있는 cin 과 cout, 즉 입출력의 묶음을 풀어준다.
cin 과 cout 은 묶여있는데, 묶여있는 스트림들은 한 스트림이 다른 스트림에서 IO 작업을 진행하기 전에
자동으로 버퍼를 비워(flush)준다.
입출력 코드를 통해 알아보자. 아래와 같은 코드가 있을 때
cout << "HI ";
cin >> name;
인 경우 HI 를 먼저 출력하고 입력을 받는다.
출력 버퍼에 내용이 들어가고 입력 요청을 받아 출력 버퍼를 비워서 출력이 되고 입력을 받는다.
즉 출력후 입력 순서이다.
그런데 입출력의 묶음을 풀게 된다면 버퍼가 비워지지 않기 때문에 출력이 되지 않고 먼저 입력을 받게 된다.
입력 후 출력 순서가 된다.
이를 사용하여 입출력의 묶음을 풀어서 자동으로 버퍼를 지우는 작업을 생략하여 실행 시간을 단축할 수 있다.
추가로, 주의사항이 있다.
줄바꿈(개행)을 할 때 '\n' 을 사용해야 한다. 기본적으로 endl 을 사용하지만 이 방법은 개행과 함께 출력 버퍼를 비워서
버퍼를 지우는 작업을 생략하도록 한 것이 필요가 없어진다.. 따라서 줄바꿈시 '\n' 을 사용하자.
그리고 이 경우에 cout 으로 출력 시 버퍼가 가득 차거나 수동적으로 비우기(flush)전까진 출력이 되지 않는다.
따라서 입력을 받기 전에 출력을 하고 싶다면 수동적으로 버퍼를 비워(flush)야 한다.
■ ios_base::sync_with_stdio(false);
C 의 stdio 와 C++ 의 iostream 의 동기화를 비활성화 해준다.
기본적으로 C 와 C++ 의 표준 스트림은 동기화되어있다.
따라서 C++ 에서 C(scanf, gets, getchar / printf, puts, putchar 등) 와 C++ 의 방법으로 입출력이 가능하다.
C 와 C++ 가 동일한 버퍼를 공유한다. 따라서 C / C++ 각 방법을 사용해도 동기화되어 순서대로 입/출력을 해준다.
위 경우에 단점이 있는데 iostream 과 stdio 의 버퍼를 모두 사용하여 딜레이가 발생한다.
이를 해결하기 위해 이 방법으로 동기화를 비활성화 한다.
이 방법으로 C++ 의 독립적인 버퍼를 사용하게 되어 입출력 딜레이가 줄어든다.
하지만 이 방법에서의 단점도 있다.
이제 C 의 버퍼를 사용할 수 없기 때문에 C 에서의 입출력 방법을 사용할 수 없다.
그리고 멀티스레드의 환경에서 출력 순서 보장이 어렵다. 스레드가 불안정, 안전하지 않다.
그렇지만 알고리즘 문제 풀이에서는 멀티스레드 작업이 필요하지 않아서 동기화를 끊는 것이 효율적.
즉 위의 방법들을 정리하자면
cin.tie(NULL); 은 입출력에서 버퍼를 자동으로 비우는 작업을 비활성화하여 시간을 단축.
ios_base::sync_with_stdio(false); 은 iostream 과 stdio 의 동기화를 비활성화해 C++ 만의 버퍼를 사용하여 시간을 단축.
3. 문제 풀이
#include <iostream>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int t, a, b;
cin >> t;
for(int i = 0; i < t; i++) {
cin >> a >> b;
cout << a+b << "\n";
}
}
입/출력의 묶음을 풀고 iostream 과 stdio 의 동기화를 줄였기 때문에 입/출력의 처리 시간이 단축되었다.
하지만 이전에 이 코드를 실행 시 결과가
입력
입력 입력
출력
입력 입력
출력
이라고 한다면
이제는
입력
입력 입력
입력 입력
출력
출력
이 되는 것이다.
4. 성능 확인

5. 마무리
cin.tie(NULL) 과 ios_base::sync_with_stdio(false) 이 무슨 역할인지 알아보았다.
여러 제한은 있지만 입출력이 많은 경우에서 시간을 많이 단축해주는것 같기 때문에 알고리즘 문제 풀이 시
시간 단축을 위해 유용하게 사용할 수 있을 것 같다.
'백준 - 단계별로 풀어보기 > 반복문' 카테고리의 다른 글
[백준] 11022번 : A+B - 8 | C++ (0) | 2023.09.20 |
---|---|
[백준] 11021번 : A+B - 7 | C++ (0) | 2023.09.20 |
[백준] 25314번 : 코딩은 체육과목 입니다 | C++ (0) | 2023.09.19 |
[백준] 25304번 : 영수증 | C++ (0) | 2023.09.19 |
[백준] 8393번 : 합 | C++ (0) | 2023.09.19 |