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

- 아주 간단한 문제이지만

- 시간 제한과 매우 큰 테스트 케이스 사이즈 인 문제이다.

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

-자료구조 실습 때나 문제해결기법 실습 때 c말고 c++ 을 쓰는 학생들도 있었기 때문에

 실습 문제의 아래 cin/cout을 사용할 경우 위에 저것을 선언해주어라

- 는 말이 항상 있었는데 구체적으로 어떤 역할을 하는지가 궁금해져서 이 기회에 알아보았다.

< cin.tie(NULL) >

default값은 cout,cin이 tie 되어 있다.

이것을 untie 하겠다.라는 것

이경우 라면 program 이 user에게 입력을 요구하기 전에 output이 flush 된다.

(기본적으로 cout의 output은 buffer가 가득차거나 수동적으로 flush 시켜전까지는 출력되지 않는다.)

만약 cin과 cout을 untie 한다면, cin으로 입력을 받기 전에 뭔가를 띄우고 싶다면 매번 수동적으로 cout을 flush 시켜줘야 한다.

 

ios_base::sync_with_stdio(false);

c 표준 stream과 c++ 표준 stream 의 동기화를 끊는다.

default는 모두 동기화 되어 있다 그래서 우리는 c,c++ 입출력 방식을 자유롭게 쓸 수 있다.

printf도 쓸 수 있고 cout도 쓸 수 있따.

이 동기화를 끊어 주면 c++ stream들은 독립적인 버퍼를 갖게되고, c와 혼용해서 쓰는 것이 위험해진다.

그리고 동기화된 c++ stream 은 thread-safe 하다.( 다른 thread의 output이 동시에 엑세스 해도 충돌하지 않는다.

동기화를 끊으면 사용하는 버퍼의 수가 줄어들기 때문에 실행속도 자체는 향상된다.

 

출처:https://codecollector.tistory.com/381

찾아보고 직접 코드를 작성하여 실행 해보았는데 나는 untie를 하고 나서

내가 스스로 flush를 해주지 않았는데도 출력이 잘 되었다...왜지?

 

*아 그리고 endl과 '\n'의 차이

이 문제에서 위의 두 사항을 모두 적용하고 출력해보았는데 

시간초과가 나왔는데 그 차이는 endl과 '\n' 의차이 였는데

endl은 개행만 해주는 것이 아니고 내부 버퍼도 비워주기 때문에 '\n'에 비해서 매우 느리다.

이것또한 알아두자 .

 

 

'학부생 공부 > 연습문제(백준)' 카테고리의 다른 글

백준 2164 카드2  (0) 2019.11.13
백준 2839 설탕배달  (0) 2019.11.10
백준 1085  (0) 2019.11.09
백준 11365 !밀비 급일  (0) 2019.11.06
백준 1002  (0) 2019.11.06

+ Recent posts