빠른 입출력: 시간 초과(TLE)를 막는 법
공식
왜 빠른 입출력이 필요한가?
입출력하는 줄 수가 수십만 ~ 수백만 줄이 되면, 입출력 자체가 느려서
시간 초과(TLE)가 나기도 합니다. 알고리즘이 맞아도 입출력 때문에 떨어지는
것이죠. 다행히 정해진 몇 줄만 추가하면 크게 빨라집니다.
1. C++ — 동기화 끄기 3종 세트
main의 맨 처음에 넣으세요.
#include <bits/stdc++.h>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
// 이후 cin / cout 사용
}
sync_with_stdio(false)— C 표준 입출력(scanf/printf)과의 동기화를 끊어cin/cout을 빠르게 만듭니다.cin.tie(nullptr)— 입력 전마다 출력을 자동으로 비우던 동작을 꺼서 속도를 올립니다.
주의: 동기화를 끈 뒤에는
cin/cout과scanf/printf를 섞어 쓰지 마세요.
2. C++ — 출력은 '\n', endl 금지
cout << x << '\n'; // 빠름 (권장)
cout << x << endl; // 느림 — 매번 버퍼를 비운다(flush)
출력이 많을 때 endl을 '\n'으로 바꾸기만 해도 눈에 띄게 빨라집니다.
3. Python — input() 대신 sys.stdin
파이썬 기본 input()은 줄 수가 많으면 느립니다.
import sys
input = sys.stdin.readline # 한 줄을 빠르게 읽는다
n = int(input())
for _ in range(n):
a, b = map(int, input().split())
# ...
sys.stdin.readline은 줄바꿈 문자(\n)까지 함께 읽으므로, 문자열을
비교할 땐 .rstrip()으로 끝의 줄바꿈을 떼 주세요. (숫자로 int(...) 변환할
땐 줄바꿈이 자동으로 무시되어 괜찮습니다.)
4. Python — 출력도 모아서 한 번에
print를 수십만 번 부르면 느립니다. 결과를 모았다가 한 번에 출력하세요.
import sys
out = []
for i in range(n):
out.append(str(i * i))
sys.stdout.write('\n'.join(out) + '\n')
또는 print('\n'.join(map(str, answers))) 처럼 한 줄로도 가능합니다.
5. 자주 하는 실수
endl남발 — 출력이 많은 문제에서 가장 흔한 TLE 원인.- 동기화 끄고
scanf와 혼용 — 입력 순서가 꼬일 수 있습니다. readline의 줄바꿈 — 문자열 비교 시\n이 붙어 있어 틀리는 경우..rstrip()하세요.
연습 팁
입출력 양이 많아 보이는 문제(예: "최대 1,000,000개의 수")를 만나면, 코드를
짜기 전에 위의 빠른 입출력 틀부터 깔아 두세요. 나중에 TLE가 났을 때
원인을 찾느라 헤매는 시간을 아낄 수 있습니다.