본문 바로가기
프로그래밍 ( Programming )/백준 알고리즘 (BaekJoon Algorithm)

15552번 - 빠른 A + B

by Jayce_choi 2020. 11. 20.
반응형

* 하단에 시간 단축 관련 추가 설명 있습니다.  

 

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의 입출력 방식을 사용하면 안 된다.

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

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

 

 


# 설명

문제에서 요구한 성능을 만족시킬 위해서 3줄의 코드가 필요하다. 

ios::sync_with_studio(false);
cin.tie(NULL);
cout.tie(NULL);

우선 3줄이 의미하는게 무엇인지 보자. 

1. static bool sync_with_stdio(bool sync = true);

ios::sync_with_studiocpp의 iostream을 c의 stdio와 동기화시켜주는 역할을 한다. 
매개변수가 기본값, 즉 true 일 때는 cout << "hi"; printf("hehe"); cout<<"Hi"가 순서대로 출력이 된다.
그러나 False로 될 경우 (동기화가 꺼짐) 출력 순서를 모르게 되는데 이때 cin, cout 함수를 getchar()와 같은 함수와 같이 쓰면 안 된다. ( C 입출력 연산과 C++ 입출력 연산을 같이 사용한다면, 그 입출력 순서들이 보장되지 않음 )

표준 C++ 스트림들은 각각의 입출력 연산에 대해 버퍼를 사용할 수 있는데, 이 경우 입출력 연산 속도로를 크게 향상할 수 있다. 

하단의 링크에 들어가서 실행 예제를 하나 참고하셔서 결과를 확인해보시면 바로 이해가 되실 겁니다.

 

C++ 레퍼런스 - ios_base::sync_with_stdio 함수

 

modoocode.com

2. cin.tie / cout.tie 

cin과 cout은 대표적인 전역 객체로 표준 C의 입력과 출력 스트림이다.
이때 stream을 tie를 하면 다른 stream에서 입출력 요청이 오기 전에 stream을 flush 하게 된다. 

구체적인 설명을 위해서 하단의 예시를 보자.  
std::cout << "Enter name:";
std
::cin >> name
stream을 untie 할 때 output에서 flush가 안되어서 Enter name이라는 메시지는 출력이 되지 않는다
( cout은 buffer가 가득 차거나 수동적으로 flush를 시켜주기 전까지 출력이 안된다. ) 

때문에 cin과 cout을 untie 할 때 cin으로 입력을 받기 전에 뭔가를 띄우고 싶을 때 매번 flush가 필요하다. 

반응형

'프로그래밍 ( Programming ) > 백준 알고리즘 (BaekJoon Algorithm)' 카테고리의 다른 글

2741번 - N 찍기  (0) 2020.11.20
8393번 - 합  (0) 2020.11.20
10950번 - A+B - 3  (0) 2020.11.18
2739번 - 구구단  (0) 2020.11.18
2884번 - 알람 시계  (0) 2020.11.17

댓글