본문 바로가기
코딩 테스트/JAVA

[Java] 코딩테스트를 위한 입출력 팁

by Youngs_ 2023. 5. 5.
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

 

글 읽기 - BufferedReader를 어떻게 사용해야 할지 모르겠습니다.

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net


큰따옴표(" ")는 문자열(String)을 감싸는 기호이고
작은따옴표(' ')는 문자(Character)를 감싸는 기호이다. 

즉, 

큰따옴표(" ") 사이에는 문자 여러개를 입력하고
작은따옴표(' ') 사이에는 문자 하나만 입력할 수 있다. 

코딩테스트에서는 입출력시 문자 하나만을 사용한다면 큰따옴표보다는 외따옴표를 사용하는것이 속도가 더 빠른것같다..?
아래 백준 문제에서 큰따옴표만 외따옴표로 바꿧을뿐인데 128ms -> 124ms로 변경됐다.
https://www.acmicpc.net/problem/9498

 


출처 : https://velog.io/@kimmjieun/Java-%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8%EB%A5%BC-%EC%9C%84%ED%95%9C-%EC%9E%85%EC%B6%9C%EB%A0%A5-%ED%8C%81

 

[Java] 코딩테스트를 위한 입출력 팁

Scanner, BufferedReader, StringTokenizerBufferedReader, StringTokenizer 는 문자열로 활용하기 위해 사용BufferedReader를 사용하는 것이 Scanner를 사용하는 것보다 빠르다 StringTokenizer

velog.io

 

댓글