개념
입출력 버퍼
버퍼는 읽거나 출력할 데이터를 모아 두는 메모리 공간입니다. 입력량이 많을 때 버퍼를 이용하면 외부 입출력 호출을 줄일 수 있습니다.
| 항목 | C++ | Java | Python |
|---|---|---|---|
| 빠른 입력 | cin 설정 변경 | BufferedReader + StringTokenizer | sys.stdin.buffer.readline 또는 read |
| 출력 모으기 | cout의 버퍼 | StringBuilder | 문자열 목록과 join |
| 모은 결과 출력 | cout | System.out.print | sys.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(...)으로 합치면 여러 줄을 한 번에 출력할 수 있습니다.
복잡도
입력 문자 수를 , 출력 문자 수를 라고 합니다.
| 연산 | 시간복잡도 | 공간복잡도 |
|---|---|---|
| 전체 입력 처리 | 전체 읽기 , 줄 단위 읽기는 최대 줄 길이에 비례 | |
| 출력 모으기·내보내기 | 출력 문자열 |
예제
문제
주어진 양의 정수를 두 배로 만들어 순서대로 출력하여라.
입력
첫 번째 값으로 수의 개수 이 주어진다. 이다. 이어서 보다 작은 양의 정수 개가 주어진다. 모든 값은 공백, 탭 또는 줄바꿈으로 구분된다.
출력
두 배로 만든 값을 한 줄에 하나씩 출력한다.