import java.io.*;
import java.util.StringTokenizer;
1. 자바의 입력 클래스
- Scanner, BufferedReader, StringTokenizer
- BufferedReader, StringTokenizer 는 문자열로 활용하기 위해 사용
- BufferedReader를 사용하는 것이 Scanner를 사용하는 것보다 빠르다
BufferedReader 사용
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();
StringTokenizer
- StringTokenizer는 공백이 있을 때 뒤에 문자열이 공백처리를 땡겨 채우도록 한다.
- StringTokenizer가 BufferedReader보다 빠르게 사용 될 수 있다
<StringTokenizer를 사용했을 때>
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
String A = st.nextToken();
String B = st.nextToken();
String C = st.nextToken();
String D = st.nextToken();
<BufferedReader를 사용했을 때>
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] input = br.readLine().split(" ");
2. 자바의 출력 클래스
- System.out.println(""), BufferdWriter, StringBuilder
- 일반적으로 출력할 때 System.out.println("")를 사용한다. 적은 양의 출력에서는 편리하고 성능 차이가 없지만 많은 양의 출력을 할 때는 BufferedWriter이나 StringBuilder를 사용하는 것이 좋다
BufferedWriter
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 선언
String str = "abcdef"; // 출력할 문자열
bw.write(s); // 출력
bw.newLine(); // 줄바꿈
bw.flush(); // 남아있는 데이터 모두 출력
bw.close();
BufferedWriter는 버퍼를 잡아 놓은 것이기에 반드시 사용후에 flush()/close()를 해주어야한다. close()를 하게되면 출력 스트림을 아예 닫아버리기 때문에 한번 출력후에 다른 것도 출력하고자 한다면 flush()를 사용하면 된다
StringBuilder
그냥 문자열이기 때문에 매우 간단하다
StringBuilder sb = new StringBuilder();
sb.append("a");
sb.append("b").append(" ");
sb.append("c").append("\n");
System.out.println(sb);
참고
https://sangwoo0727.github.io/java/JAVA-20_input/
https://wkimdev.github.io/java/2018/04/06/java-io-bufferedreader/
https://rlakuku-program.tistory.com/33
https://code0xff.tistory.com/10
일반적으로 BufferedReader 를 통해 입력받을때 유의하셔야 할 점이 몇가지 있습니다.
1. 기본적으로 BufferedReader는 한 줄을 통째로 입력받는 방법으로 주로 쓰입니다.
2. readLine() 메서드는 값을 읽어올 때, String값으로 개행문자(엔터값)를 포함해 한줄을 전부 읽어오는 방식입니다.
- 비슷한 예로 Scanner메서드 중 nextLine()도 스트링 값과 개행문자(엔터값)을 같이 읽어옵니다.(반면 next()는 개행문자는 제외하고 스트링 값만 읽어옵니다.)
- 예제의 입력 예제를 보면 각 문장이 모두 개행문자(엔터)로 구별되있는것을 확인하실 수 있습니다. 따라서 이 문제에서 개행문자를 입력받는것은 필수입니다!
3. read() 메서드는 값을 읽어올 때, int값으로 변형하여 읽어오는 방식입니다.
- 예를들어 input.txt에 저장된 1이라는 숫자를 read()를 통해 읽어오면 int형 숫자 1을 읽어오는 것이 아닌, txt형식으로 저장된 ASCII 형식의 문자값 '1'을 읽어오는 것이므로 결국 int값으론 49를 읽어오는 것이 됩니다.
- 이를 해결하려면 int a = br.read() - 48; br.readLine(); 을 하여 ASCII 값에서 뻴셈을 이용한 뒤 엔터 값을 읽어오거나, int a = Integer.parseInt(br.readLine()); 를 통해 엔터값을 포함해 한줄을 통째로 입력받은 뒤 해당 스트링값을 int로 형변환 해주는 방법이 있습니다. (저같은 경우에는 주로 후자의 방법을 사용합니다)
-> 출처 : https://www.acmicpc.net/board/view/9744
큰따옴표(" ")는 문자열(String)을 감싸는 기호이고
작은따옴표(' ')는 문자(Character)를 감싸는 기호이다.
즉,
큰따옴표(" ") 사이에는 문자 여러개를 입력하고
작은따옴표(' ') 사이에는 문자 하나만 입력할 수 있다.
코딩테스트에서는 입출력시 문자 하나만을 사용한다면 큰따옴표보다는 외따옴표를 사용하는것이 속도가 더 빠른것같다..?
아래 백준 문제에서 큰따옴표만 외따옴표로 바꿧을뿐인데 128ms -> 124ms로 변경됐다.
https://www.acmicpc.net/problem/9498
'코딩 테스트 > JAVA' 카테고리의 다른 글
[코딩테스트] String 배열에서 특정 문자 찾기 (0) | 2023.11.11 |
---|---|
[JAVA] 문자열 효율적으로 더하기 (StringBuilder) (0) | 2023.05.05 |
댓글