IT/BaekJoon

[백준/JAVA] 15552번 '빠른 A+B' BufferedReader 설명

Buang 2023. 4. 23. 21:49
반응형

1. 문제

https://www.acmicpc.net/problem/15552

 

15552번: 빠른 A+B

첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다.

www.acmicpc.net


2. 풀이

 

덧셈 연산을 사용자가 입력한 숫자만큼 반복해주면 된다.

가령 2를 입력했을 때 총 두 번의 덧셈 연산을 수행 후 출력하면 되는 것이다.

 

문제는 BufferedReader와 BufferedWriter다.

문제 푸는 속도가 빨라야 해서 Scanner를 사용해서 풀면 오답 처리 된다.

 

Scanner를 사용해서 풀다가 갑자기 BufferedReader와 Writer로 풀어야 해서

당황하셨을 분들을 위해 이에 대해 설명하고자 한다.

 

 

버퍼란?

 

버퍼는 임시저장장치다.

왜 이 버퍼를 사용했을 때 더 속도가 빠른지 의문이 들 수 있다.

 

버퍼(임시 저장장치)를 사용하지 않을 때의 입력은

키보드 입력이 키를 누르는 즉시 바로 프로그램에 전달된다.

 

버퍼(Buffer)를 사용하면 키보드의 입력이 있을 때

바로 프로그램에 전달하는 게 아닌 일단 버퍼(임시 저장장치)로

전송한 뒤 버퍼가 가득 차거나 개행 문자가 있을 시

버퍼에 있는 내용을 한 꺼번에 프로그램에 전달한다.

 

이사를 하면서 생기는 쓰레기는 그때그때 바로 쓰레기장에 버리러 나가는 것 보단

일단 이사가 다 끝나고 난 뒤 쓰레기를 한 꺼버에 모아서 쓰레기장으로 옮기는 게 더 효율적일 것이다.

이렇게 어떤 것을 모아서 한 번에 처리하는 것이 버퍼라 속도도 빠르구나~

라고 이해하면 쉽다.

 

 

 

BufferedReader와 BufferedWriter

BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //Scanner와 유사
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // System.out.prinln()과 유사

 

BufferedReader는 Scanner와 유사하다.

 

Scanner scan = new Scanner(System.in);

 

우리가 입력받을 때 사용하던 위와 같은 Scanner를 떠올리면 된다.

 

BufferedWriter은 출력을 해주는 System.out.println()과 유사하다.

 

 

readLine

 int n = Integer.parseInt(br.readLine());

 

- readLine은 입력을 받을 때 사용하는 메서드다. next 메서드 느낌.

 

Scanner scan = new Scanner(System.in);
int n = scan.nextInt(); // 사용자가 입력한 N 값 저장


- br.readLine()이 잘 와닿지 않는다면 scan.nextInt을 떠올리면 이해하기 한결 쉽다.
- readLine 메서드로 입력받은 건 String type으로 고정되서 다른 타입으로 입력받으려 할 땐 형 변환이 필요하다.

- 여기선 정수형으로 받아줘야 해서 Integer.parseInt를 작성해서 String을 int로 바꿔줬다.

 

 

StringTokenizer

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

 

 - StringTokenizer는 띄어쓰기 단위로 데이터를 가공한다.

- 원래 BufferedReader를 통해 읽어온 데이터는 개행문자 단위(엔터 단위 혹은 한 줄 단위)로 나누어진다.

- 만약 공백 단위(띄어쓰기 혹은 스페이스바 단위)로 데이터를 가공하고자 하면

   StringTokenizer 메서드를 사용하면 된다.

 

- 문제에서 두 개의 숫자를 입력받아서 더하라 했고, 입력형태는 두 개의 숫자를 공백 단위로 입력받고 있다.

- 예) 1 2 이런 식으로 공백(스페이스바 단위)로 입력받고 있다.

       1

       2

이렇게 엔터 단위로 입력받으려는 것이 아니다.

그래서 공백단위로 데이터를 가공하기 위해 StringTokenizer를 사용한다.

 

 

nextToken

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

 

StringTokenizer의 nextToken() 메서드를 사용해서

readLine()을 통해 입력 받은 값을 공백 단위로 구분하여 순서대로 호출할 수 있다.

 

 

 

3. 코드

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 { //Buffer 사용 시에는 예외처리를 해줘야 한다!

            //BufferReader를 사용해서 A+B 만들기

            BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //Scanner와 유사
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // System.out.prinln()과 유사

            int n = Integer.parseInt(br.readLine());
            // readLine은 입력을 받을 때 사용하는 메서드다. next 메서드 느낌?
            // br.readLine()이 scan.nextInt 느낌 같기도 하다.
            //  readLine 메서드로 입력받은 건 String type으로 고정되서 다른 타입으로 입력받으려 할 땐
            // 형 변환이 필요하다. 여기선 정수형으로 받아줘야 해서 Integer.parseInt를 작성해서 String을 int로 바꿔줬다.


            //StringTokenizer st; //띄어쓰기 단위로 데이터 가공
            // BufferedReader를 통해 읽어온 데이터는 개행문자 단위(엔터 단위 혹은 한 줄 단위)로 나누어진다.
            // 만약 이를 공백 단위(띄어쓰기 혹은 스페이스바 단위)로
            // 데이터를 가공하고자 하면 StringTokenizer 메서드를 사용하면 된다.

            for (int i = 0; i < n; i++) { //n에 입력된 숫자만큼 덧셈 연산 반복
                //st = new StringTokenizer(br.readLine()," ");
                StringTokenizer st = new StringTokenizer(br.readLine());
                bw.write((Integer.parseInt(st.nextToken()) + Integer.parseInt(st.nextToken()))+ "\n");
                // StringTokenizer의 nextToken() 함수를 쓰면 readLine()을 통해 입력 받은 값을 공백 단위로 구분하여 순서대로 호출할 수 있다.
            }
            br.close();

            bw.flush();
            bw.close();

        }
    }

 

 

전체 코드는 위와같다.

 

 

 

 

 

참고 사이트

 

https://rlakuku-program.tistory.com/33

 

[Java] 빠른 입출력을 위한 BufferedReader, BufferedWriter, StringTokenizer, StringBuilder

BufferedReader / BufferedWriter BufferedReader와 BufferdWriter는 버퍼를 사용하여 읽기와 쓰기를 하는 함수이다. 버퍼를 사용하지 않는 입력은, 키보드의 입력이 키를 누르는 즉시 바로 프로그램에 전달된다.

rlakuku-program.tistory.com

 

반응형