개념

입출력 버퍼

버퍼는 읽거나 출력할 데이터를 모아 두는 메모리 공간입니다. 입력량이 많을 때 버퍼를 이용하면 외부 입출력 호출을 줄일 수 있습니다.

항목C++JavaPython
빠른 입력cin 설정 변경BufferedReader + StringTokenizersys.stdin.buffer.readline 또는 read
출력 모으기cout의 버퍼StringBuilder문자열 목록과 join
모은 결과 출력coutSystem.out.printsys.stdout.write

C++

ios::sync_with_stdio(false)는 C 입출력과 C++ 스트림의 동기화를 해제합니다. cin.tie(NULL)는 입력할 때마다 출력 버퍼의 내용을 실제로 출력하는 동작을 해제합니다. 두 설정은 첫 입출력 전에 적용하고, 이후 입출력은 cin과 cout으로 통일합니다.

'\n'은 줄바꿈을 기록합니다. endl은 줄바꿈과 버퍼에 모인 내용을 실제로 출력하는 동작을 함께 수행하므로 출력량이 많은 반복문에서는 '\n'을 사용합니다.

Java

BufferedReader로 한 줄을 읽고 StringTokenizer로 공백 단위의 값을 꺼냅니다. 현재 줄의 값을 모두 읽었을 때 다음 줄로 넘어가도록 입력 함수를 만들면, 값이 여러 줄에 나뉘어 있어도 처리할 수 있습니다. StringBuilder에 답을 모아 마지막에 출력합니다.

Python

sys.stdin.buffer.read().split()은 전체 입력을 읽어 공백 단위로 나눕니다. 줄 구분과 관계없이 순서대로 값을 처리할 수 있습니다. 입력 전체를 메모리에 저장하므로 입력이 큰 경우에는 readline()으로 한 줄씩 처리하는 방법도 사용합니다.

출력할 값을 문자열로 모아 '\n'.join(...)으로 합치면 여러 줄을 한 번에 출력할 수 있습니다.

복잡도

입력 문자 수를 LL, 출력 문자 수를 KK라고 합니다.

연산시간복잡도공간복잡도
전체 입력 처리O(L)O(L)전체 읽기 O(L)O(L), 줄 단위 읽기는 최대 줄 길이에 비례
출력 모으기·내보내기O(K)O(K)출력 문자열 O(K)O(K)

예제

문제

주어진 양의 정수를 두 배로 만들어 순서대로 출력하여라.

입력

첫 번째 값으로 수의 개수 NN이 주어진다. 1≤N≤10 0001\le N\le10\,000이다. 이어서 10 00010\,000보다 작은 양의 정수 NN개가 주어진다. 모든 값은 공백, 탭 또는 줄바꿈으로 구분된다.

출력

두 배로 만든 값을 한 줄에 하나씩 출력한다.

예제 입력

4
3 5 1 8

예제 출력

6
10
2
16

예제 코드

C++20

#include <iostream>
#include <cstddef>

using namespace std;

int main() {
    int n, i, x;

    ios::sync_with_stdio(false);
    cin.tie(NULL);

    cin >> n;
    for (i = 0; i < n; ++i) {
        cin >> x;
        cout << x * 2 << '\n';
    }
}