백준 문제를 풀다 보면 입력과 출력의 수가 많은 문제들이 있다.
예시로 위 문제는 최대 100만번의 입력과 50만번의 출력이 수행되어야 한다.
C++에서 이런 문제를 cin, cout으로 풀면 코드를 잘 짜더라도 시간 초과가 뜬다. 코드에 두 줄만 추가해주면 된다.
코드
#include <iostream>
int main {
std::ios::sync_with_stdio(false);
std::cin.tie(NULL)
// code
return 0;
}
의미를 살짝 보면
std::ios_base::sync_with_stdio(false);
원래 <iostream>의 cin, cout은 <stdio.h>의 printf 등에서 사용하는 입출력 버퍼와 동기화되어 있다.
이를 false로 설정하면 동기화 과정이 생략되고 빠르게 입출력을 진행할 수 있다.
실제로는 동기화가 생략된 만큼 멀티쓰레드 프로그램에서 출력의 순서를 보장할 수 없다는 단점이 있지만, PS에서는 멀티쓰레딩을 많이 쓰지 않으니 쓰는 것 같다. 실무에서 쓰려면 부작용을 더 자세히 알아봐야겠다.
std::cin.tie(NULL);
원래 cin과 cout은 실행 전 버퍼가 비워져 있음(flushed)을 보장 받는다.
이 설정을 NULL로 설정하면 버퍼가 비워지기도 전에 다른 연산을 수행할 수도 있게 된다.
예를 들면 출력이 다 끝나기 전에 cin이 실행될 수 있는 것이다.
PS에서는 입력만 (채점 프로그램을 통해) 받으면, 출력만 하면 되기 때문에 무시하고 사용하지만, 실무에서 쓰려면 부작용을 더 알아봐야겠다.
참고로 다른 글에서 cout.tie를 찾을 수 있는데,
cin이 호출될 때 스트림의 버퍼가 비워지는 cin.tie는 의미 있는 시간 단축이 있는 반면,
cout이 호출될 때 다른 스트림의 버퍼가 비워지는 cout.tie는 PS에서도 실질적으로 의미 있는 코드가 아니라고 한다. (멀티쓰레딩에서의 출력 스트림에서나 의미가 있을까? 자세히는 모르겠다.)
'Algorithm > 백준' 카테고리의 다른 글
[백준] 10845번: 큐 (직접 구현과 비교, c++) (1) | 2024.10.16 |
---|---|
[백준] 7568번: 덩치 (빠른 풀이, C++) (0) | 2024.10.15 |