본 게시글은 실전 기술을 정리해 놓은 '실전 압축' 입니다.
입출력
언어 | 입력 | 출력 |
C++ | scanf / cin | printf / cout |
Java | Scanner | System.out |
Python | input |
C++
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int n;
scanf("%d", &n);
printf("%d", n);
return 0;
}
#define _CRT_SECURE_NO_WARNINGS는 Visual Studio에서만 넣어주면 됩니다.
scanf는 나온 지 오래된 함수라 입력 값의 길이를 설정할 수가 없습니다.
따라서 보안에 취약하기 때문에 Visual Studio에서는 사용하지 말라는 경고가 출력되고 컴파일 에러가 발생하는데
#define _CRT_SECURE_NO_WARNINGS 를 선언해주면 에러가 발생하지 않습니다.
(리눅스, OS X 사용자라면 넣지 않아도 됩니다).
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
cout << n;
return 0;
}
Java
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n;
n = scanner.nextInt();
System.out.print(n);
}
}
Python
n = input()
print(n)
빠른 입출력
언어 | 입력 | 출력 |
C++ | ios_base::sync_with_stdio(0); cin.tie(0); cin |
ios_base::sync_with_stdio(0); cin.tie(0); cout |
Java | BufferedReader(new InputStreamReader(System.in)) | BufferedWriter(new OuputStreamWriter(System.out)) |
Python | sys.stdin.readline() | sys.stdout.write() |
C++
scanf, printf가 아닌 cin, cout을 쓰고자 할 때 해당
아이디어
c++ stream과 c stream 사이의 sync를 꺼서 속도를 높이자
매번 버퍼를 비우지 말자
#include<iostream>
using namespace std;
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int n;
cin >> n;
cout << n;
return 0;
}
// input 3
// output 3
함수 | 설명 |
ios_base::sync_with_stdio(0) | c++ stream과 c stream 사이의 sync를 끄는 명령입니다. cout과 printf를 섞어서 사용할 경우 출력 순서를 유지하도록 해주는 sync가 있는데 이것을 꺼서 시간 낭비를 줄이는 것입니다. 위 명령을 실행한 이후 cout과 printf를 섞어서 쓰면 안됩니다. |
cin.tie(0) | cin과 cout이 번갈아 나올 때마다 flush하지 않도록 하는 명령입니다. flush 가 되지 않으면 프로그램 흐름과 콘솔에 찍히는 결과가 다를 수 있지만 채점 환경에서는 input buffer오 output buffer가 분리되어 있으므로 flush 해줄 필요가 없습니다. |
endl 대신 \n | 줄바꿈에 endl을 사용하면 줄을 바꾸고 flush(출력 버퍼 비우기)를 합니다. 이 flush작은 매우느리기 때문에 버퍼를 비우지 않는 \n을 써야 합니다. |
Java
아이디어
입출력 데이터가 바로 전달되지 않고 중간에 버퍼링되어 전달하여 많은 데이터를 효율적으로 처리하자
Buffer에 있는 IO 클래스 활용 + 문자열 자르는 StringTokenizer, 문자열 합치는 StringBuilder 사용
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Test {
public static void main(String[] args) {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
try {
int a;
a = bf.read();
bw.write(a);
bw.newLine();
bw.flush();
bw.close();
} catch (Exception e){
e.printStackTrace();
}
}
}
// input 3
// output 3
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Test {
public static void main(String[] args) {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
try {
StringTokenizer st = new StringTokenizer(bf.readLine());
bw.write(st.nextToken());
bw.newLine();
bw.flush();
bw.close();
} catch (Exception e){
e.printStackTrace();
}
}
}
// input 3
// output 3
함수/객체 | 설명 |
BufferedReader(new InputStreamReader(System.in)) | 문자입력 버퍼스트림 생성 InputStream을 이용해 데이터를 입력받고 BufferedReader를 통해 버퍼에 저장 |
BufferedWriter(new OuputStreamWriter(System.out)) | 문자출력 버퍼스트림 생성 OutputStream을 이용해 데이터를 입력받고 BufferedWrtier를 통해 버퍼에 저장 |
StringTokenizer | 문자열을 자를 때 사용 웬만하면 Buffered IO와 같이 사용한다고 보면 된다. |
StringBuilder | StringBuilder은 변경 가능한 문자열이다. 문자열 더할 때 효율적으로 사용할 수 있다. 동기화가 적용되지 않아 단일 스레드에서만 사용된다. String은 private final char형이다. = 값이 변할 수 없다. 따라서 String + String은 새 객체에 String에 합쳐서 넣는 것 |
Scanner 버퍼 사이즈 1024 chars
BufferedReader 버퍼 사이즈 8192 chars
Python
Python3 -> PyPy로 제출
import sys
n = int(sys.stdin.readline());
sys.stdout.write(str(n)) # int는 str로 바꿔줘서 넣어야 함
# input 3
# output 3
import sys
n = int(sys.stdin.readline()); # 한 줄 입력받는다.
a = sys.stdin.readline()
b = sys.stdin.readline().split() # 공백(스페이스, 텝, 엔터)로 구분해준다.
c = sys.stdin.readline().rstrip()
# 입력 1 2 3
sys.stdout.write(str(n)) # int는 str로 바꿔줘서 넣어야 함
sys.stdout.write(a)
sys.stdout.write(b[0])
sys.stdout.write(c)
# input 1 2 3
# ouput 1 2 3\n
# 1
# 123
함수 | 설명 |
sys.stdin.readline() | 마지막 개행을 포함하여 한 줄 입력받는다. (아직 왜 빠른지 이유는 몰라서 시간나면 찾아보겠음) |
sys.stdout.write() | 문자열을 입력 받아서 출력 print() 처럼 자동으로 개행해주지 않음 |
입출력 속도 비교
https://www.acmicpc.net/blog/view/56
https://www.acmicpc.net/blog/view/57
빠른 A+B
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
입력 쉽게 받기
입력 데이터를 매번 콘솔창에 붙여넣기 매우 귀찮을 때 다음과 같은 쉬운 방법이 있습니다.
바로 메모장 같은 곳에 미리 붙여넣고 컴파일 하면 알아서 입력 데이터를 불러오도록 하는것 입니다
(이름은 뭐든 상관 없지만 여기서 텍스트 이름은 input으로 통일하겠습니다.
조심할 점은 확장자랑 이름 헷갈려서 input.txt.txt 이런 식으로 만들면 안됩니다.)
텍스트 파일안에 입력 데이터를 붙여 넣습니다.
C++
input.txt 파일은 위치한 경로로 불러올 수도 있지만 편의를 위해
프로젝트(proj파일)가 위치한 폴더에 생성합니다.
프로젝트를 변경하지 않는 이상 그대로 두고 계속 사용하면 됩니다.
freopen(파일 이름, 모드, 작업을 수행할 스트림의 FILE 객체에 대한 포인터);
input 이란 이름의 텍스트 파일을 읽기 전용으로 표준 입력으로 읽어들이겠다는 뜻입니다.
int main()
{
freopen("input.txt", "r", stdin);
int n;
cin >> n;
cout << n;
return 0;
}
// input 3
// output 3
Python
open(파일경로와이름, 모드, 인코딩)
# 한 줄 읽기
f = open("input.txt", 'r')
n = f.readline()
print(n)
f.close()
# input 3
# output 3
# 모든 줄을 읽어서 리스트로 반환
n = f.readlines()
# 모든 줄을 읽어서 문자열로 반환
n = f.read()
'C++ > 알고리즘' 카테고리의 다른 글
C++ 정렬 알고리즘 (버블정렬, 삽입정렬, 선택정렬, 합병정렬, 퀵정렬, 힙정렬, 셀정렬, 기수정렬) (0) | 2019.10.22 |
---|---|
[실전 압축 알고리즘] - 실수형을 특정 소수점 까지 출력 (0) | 2019.10.18 |
[실전 압축 알고리즘] - C/C++ 문자 숫자 변환 (0) | 2019.10.18 |
[실전 압축 알고리즘] - 비트 연산 (0) | 2019.10.18 |
[실전 압축 알고리즘] - 시간, 공간 복잡도 (0) | 2019.08.24 |