본문 바로가기
Etc/Algorithm

[JAVA] 백준 15552번: 빠른 A+B / BufferedReader vs. Scanner

by 달의 조각 2021. 8. 1.

 

  1. 많은 양의 데이터를 입력받을 경우 Scanner를 사용하는 것보다 BufferedReader를 사용하는 것이 훨씬 빠르다.
  2. Scanner는 여러 자료형으로 입력값을 받을 수 있고, BufferedReader는 무조건 문자(String)로 처리한다.
  3. BufferedReader / BufferedWriter 는 java.io 패키지에 들어있다.
  4. 예외 처리(thorws IOException)를 해 준다. (Scanner는 자체 예외 처리)
  5. StringTokenizer 와 nextToken()을 이용하여 문자열을 나누고 나눈 문자를 순서대로 출력한다.
  6. flush()를 이용하여 buffer를 비워 준다.

 


 

BufferedReader

 

Scanner: 키보드에 입력하는 것을 바로바로 프로그램에 전달

BufferedReader: 입력되는 문자들을 buffer공간에 모으고, 입력 문자(엔터) 입력 시 문자들을 한번에 프로그램으로 전달

때문에 속도가 빠르고, 시간 복잡도가 적다.

적은 양의 입력값일 경우, Scanner가 직관적이기 때문에 편리

많은 양이 입력될 경우, CPU나 성능면에서 효율적인 BufferedReader를 사용

단, BufferedReader는 오래된 클래스이기 때문에 Scanner처럼 문자, 숫자를 가리지 못하고 무조건 문자(String)로 처리하기 때문에(리턴 타입: String) 숫자 입력 시 반드시 형변환 필요

parse 함수 또는 Integer.parseInt(br.readLine())를 이용해 형변환 한다.

 

BufferedWriter

 

Scanner와 마찬가지로 일반적으로 출력을 할 때 System.out.println(""); 방식을 사용

많은 양의 출력에서는 BufferWriter가 더 효율적이지만, 입력받은 데이터를 문자열로 Buffer에 모아두었다가 flush()를 만나면 문자열로 출력하기 때문에 출력 시 형태를 주의

(ex. print로 1을 출력하면 1이 그대로 출력되지만 write로 1을 출력하면 이상한 문자가 출력된다.)

 

import java.util.*;

public static void main(String[] args) {

	Scanner sc = new Scanner(System.in);
	int a = sc.nextInt();
	double d = sc.nextDouble();
	String s = sc.next(); // 또는 nextLine();
}
import java.io.*;

public static void main(String[] args) throws IOException {

	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	String s = br.readLine();
	int n = Integer.parseInt(br.readLine());
	double d = Double.parseDouble(br.readLine());

}

 

StringTokenizer

 

입력받은 문자열을 특정 문자 기준으로 나눠주는 메소드

띄어쓰기를 이용하여 두 개의 수를 입력한 후 StringTokenizer를 이용하여 문자를 나눈다.

Scanner는 공란과 줄바꿈을 입력값의 경계로 사용, BufferedReader는 보통 라인 단위로 입력을 받는다.

 

StringTokenizer st = new StringTokenizer(br.readLine(), " ");

// 11 12 입력하면 -> 공백문자(" ")를 기준으로 앞에 11과 12로 분리

 

nextToken()

 

StringTokenizer으로 나눠진 문자열을 순서대로 불러 온다.

 

bw.write((Integer.parseInt(st.nextToken()) + Integer.parseInt(st.nextToken())) + "\n");

 

write는 print처럼 줄바꿈 기능이 없기 때문에 개행 문자(\n)나 newLine() 삽입

BufferWriter는 문자열을 저장하는 곳이기 때문에 입력된 숫자는 숫자로 인식하지 못하고 숫자에 해당하는 문자로 변경

따라서 ()안에 입력되는 숫자를 숫자 형태 그대로 문자로 인식될 수 있도록 임의의 문자열 넣기 (ex. " " + 12)

 

bw.write(""+ (Integer.parseInt(st.nextToken()) + Integer.parseInt(st.nextToken())));

 

flush()

 

bw.flush();

 

 

* InputStreamReader란?

 

문자열을 character 단위(한 글자)로 읽는다.

한 글자씩 문자열을 읽기 때문에 긴 문자열을 읽을 때는 비효율적, 이 점을 보완하고자 BufferdReader를 같이 사용

 

 

import java.io.*;
import java.util.*;

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));
        
        int n = Integer.parseInt(br.readLine());
        
        for(int i = 0 ; i < n ; i++)
        {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int x = Integer.parseInt(st.nextToken());
            int y = Integer.parseInt(st.nextToken());
            bw.write(x + y + "\n");
        }
        
       bw.flush();
        
    }
}

댓글