티스토리 뷰
지난번에 알아본 Scanner는 편리하게 입력을 받을 수 있는 장점이 있으나, 속도가 느리다는 단점이 있었다. 백준 등의 알고리즘 사이트에서는 보통 실행속도의 증가를 위해서 BufferedReader와 BufferedWriter를 사용하여 입출력을 하는 경우가 있다.
입력 : BufferedReader
BufferedReader는 Java.io 패키지에서 제공하는 클래스로, 버퍼(Buffer)를 사용해서 입력을 한번에 받음으로써 시간을 획기적으로 줄일 수 있다.
| next() | 입력된 값 중 한글자를 반환한다. |
| nextLine() | 입력된 값 중 개행(enter)으로 구분된 전체 줄을 반환한다. |
BufferedReader 는 Scanner 에 비해 훨씬 빠른 입력속도를 자랑하며, 실제로 BufferedReader를 사용했는데 시간초과가 난다면 99.9%의 확률로 입력에 문제가 있는 것이 아니라 본인의 로직에 문제가 있는 것이다.
APS에선 일반적으로 nextLine() 메서드를 사용하여 입력값을 가져오게 되는데, Scanner의 nextInt() 와 같이 사용자가 원하는 자료형으로 직접 데이터를 가져올 수 있는 방법은 제공하지 않는다. 그래서 일반적으로는 StringTokenizer 등으로 토큰화 시킨 뒤에, 각 자료형의 Wrapper 클래스의 parse 메서드를 통해 데이터를 가져오는 방법을 택한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("정수를 띄어쓰기로 구분하여 입력해주세요.");
StringTokenizer st = new StringTokenizer(br.readLine()); // StringTokenizer로 토큰화
System.out.println("입력값을 출력합니다.");
while(st.hasMoreTokens()){ // 토큰이 아직 남았을 경우
System.out.println(Integer.parseInt(st.nextToken())); // parse로 다시 정수로 변환
}
}
}
결과

일반적인 알고리즘 풀이에선 StringTokenizer와 반복문을 통해 입력값을 토큰화 시키는 경우가 많으며, 실제로도 이런 간단한 토큰화에서는 StringTokenizer이 가장 간결하고 뛰어난 성능을 보인다. 현대 Java에서는 StringTokenizer의 사용대신 split() 등의 메서드 사용을 권장하고 있으므로 관심있으면 검색해보자.
출력 : BufferedWriter
BufferedWriter는 Java.io 패키지에서 제공하는 클래스로, 버퍼(Buffer)를 사용해서 출력을 한번에 함으로써 시간을 획기적으로 줄일 수 있다.
| write() | 버퍼에 출력값을 저장한다. |
| flush() | 버퍼에 저장된 출력값을 모두 출력한다. close()는 출력한 뒤 스트림을 닫는다. |
BufferedWriter를 써야 시간 제한을 맞출 수 있는 문제는 사실상 거의 없다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
System.out.println("정수를 띄어쓰기로 구분하여 입력해주세요.");
StringTokenizer st = new StringTokenizer(br.readLine());
System.out.println("입력값을 출력합니다.");
while(st.hasMoreTokens()){
bw.write(st.nextToken());
bw.write("\n");
}
bw.close();
}
}
결과

BufferedWriter의 write()메서드는 반드시 String값을 인수로 받아야 한다. 따라서 숫자는 물론이고, StringBuilder 등도 String.valueOf() 메서드나 toString() 메서드를 통해서 바꿔줘서 인수로 넣어줘야 한다. 또한, write()가 완료되더라도 flush() 혹은 close()메서드를 사용해야 반드시 콘솔창에 출력된다는 점도 주의하자.
'APS > 이론' 카테고리의 다른 글
| [APS] 02 : 자료구조 - 배열 (0) | 2025.03.19 |
|---|---|
| [APS] 01 : 자료구조 개론 (0) | 2025.03.19 |
| 투포인터 - 1 (0) | 2025.02.17 |
| [APS] 입출력 : Scanner / StringBuilder (11) | 2024.12.28 |
| [APS] 입출력 : System 입출력 메서드 (9) | 2024.12.28 |
- Total
- Today
- Yesterday
- StringBuilder
- 레코드
- Scanner
- 입출력
- 알고리즘
- 필드
- 자료구조
- oracle
- 배열
- db의 역사
- dialect
- 테이블
- Java
- 데이터베이스
- db오브젝트
- DBMS
- BufferedWriter
- APS
- SQL이란
- BufferedReader
- DB
- SQL
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |