-
[Java] BufferedReader와 BufferedWriter (입출력 속도)IT Study/컴퓨터 기초 2023. 3. 15. 10:44728x90
백준 알고리즘을 풀며 Scanner와 System.out.println() 사용할 때,
📌 시간 초과가 나는 이유는 무엇일까요?
- Java 입력 속도
6위에 자리매김한 BufferedReader와 Integer.parseInt와 비교하여
Scanner를 사용할 때에는 약 7배 정도 느려집니다.
- Java 출력 속도
7위에 위치한 BufferedWriter와 bf.write()와 비교하여
System.out.println()의 출력 속도는 약 30배 이상 느리다는 것을 확인할 수 있습니다.
버퍼는 데이터를 전송하는 동안 일시적으로 데이터를 보관하는 임시 메모리 영역으로,
입출력 속도 향상을 위해 사용할 수 있습니다.
이를 위해 우리는 BufferedReader - BufferedWriter를 사용할 수 있어야 합니다.
📌 BufferedReader : 입력 방법
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 선언 br.readLine() 한 줄 읽어 String 타입으로 변경 br.close() 입력 스트림 닫기 1. 선언 : BufferedReader를 사용하기 위해서는 throws IOException를 통해 예외 처리하는 것이 필수입니다.
public class Main { public static void main(String[] args) throws IOException { // 예외 처리 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 선언 } }
2. 입력받기
2-1. String 문자열 입력받기 : br.readLine()는 String 타입의 한 줄을 입력받을 수 있습니다.
String s = br.readLine();
2-2. int 정수 입력받기 : Integer.parseInt()를 통해 문자열을 정수로 변환할 수 있습니다.
int i = Integer.parseInt(br.readLine());
2-3. 입력받은 문자열에 공란(" ") 존재 시, 공란으로 구분하여 데이터 사용하기
2-3-1. StringTokenizer 사용
StringTokenizer st = new StringTokenizer(br.readLine(), " "); // StringTokenizer(br.readLine(), " ") : 입력받은 문자열 br.readLine()을 구분자 공란(" ")으로 분리하여 Token st에 저장 // StringTokenizer(String str,String delim) : 주어진 문자열 str을 구분자 delim으로 분리하여 Token st에 저장
2-3-2. String과 split
String str = br.readLine(); String arr[] = str.split(" "); // 입력받은 문자열 str을 공란(" ")으로 분리하여 배열 arr[]에 저장
3. 입력 스트림 닫기 : 더 이상 입력받지 않는다면 입력 스트림을 닫아줍니다.
br.close();
📌 BufferedWriter : 출력 방법
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); 선언 bw.write() 출력할 내용 담기 (출력 X) bw.flush() 출력과 동시에 버퍼 비우기 bw.close() 출력 스트림 닫기 1. 선언 : BufferedWriter를 사용하기 위해서는 throws IOException를 통해 예외 처리하는 것이 필수입니다.
public class Main { public static void main(String[] args) throws IOException { // 예외 처리 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 선언 } }
2. 출력과 출력 스트림 닫기
String s = "Hello"; // 출력할 문자열 bw.write(s + "\n"); // 출력할 내용 담기 bw.flush(); // 출력과 동시에 버퍼 비우기 bw.close(); // 출력 스트림 닫기
백준 알고리즘을 풀어보며..
처음엔 풀이하는 데에만 집중했지만 시간이 갈수록 시간과 메모리를 단축하는 데에 욕심이 생기는 것 같아요!
이를 위해서는 반드시 BufferedReader와 BufferedWriter을 알고 있어야 할 것 같습니다.
이해되지 않는 부분이 있다면 댓글 남겨주세요 :)
참고(도움을 아주 많이 받은) 사이트 :
백준, https://www.acmicpc.net/blog/view/56
제이온, https://steady-coding.tistory.com/183#'IT Study > 컴퓨터 기초' 카테고리의 다른 글
[Java] 변수와 메모리 (0) 2023.03.24 [Java] next()와 nextLine() 차이와 사용법 (0) 2023.03.24 [Java] String 클래스의 equals(), ==, = 의 차이점 (0) 2023.03.23 [Java] StringTokenizer (0) 2023.03.15 [보수] 음수 10진수를 2진수로 변환하기 (1의 보수, 2의 보수) (0) 2023.03.10