[백준java] for - 15552 / 빠른 A+B (BufferedReader, BufferedWriter)

2021. 10. 16. 15:24

우선 나는 BufferedReader와  BufferedWriter의 존재를 지금 처음 알았다..ㅎ

계속 Scanner과 System.out.println으로 해온 사람...

이 개념부터 먼저 정리해보기!


BufferedReader 

= Scanner과 유사

 

BufferedWriter

= System.out.println(); 과 유사

 

  • 둘은 scanner, System.out.println()보다 속도 측면에서 훨씬 빠르기 때문에 많은 양의 데이터를 처리할 때 유리하다.
    → 입력된 데이터가 바로 전달되지 않고 버퍼를 거쳐 전달되므로 데이터 처리 효율성을 높인다.
  • BufferedReader은 Enter만 경계로 인식하고 받은 데이터가 String으로 고정되기 때문에 입력 받은 데이터를 가공하는 작업이 필요한 경우가 많다.

BufferedReader 사용법
BufferedReader bf = new BufferedReader(net InputStreamReader(System.in)); //선언
String s = bf.readLine(); //String
int i = Integer.parseInt(bf.readLine()); //int

입력은 readLine();이라는 메서드를 사용하는데 여기서 주의할 점이 두가지 있다.

  1. readLine() 시 리턴값이 String으로 고정되기에 String이 아닌 다른 타입으로 입력 받으려면 형변환을 해줘야 한다.
  2. 예외처리를 꼭 해줘야 한다. readLine을 할 때마다 try&catch를 활용하여 예외처리를 해줘도 되지만 대부분 throws IOException을 통해 작업한다.
StringTokenizer st = new StringTokenizer(s); //StringTokenizer인자값에 입력 문자열을 넣는다.
int a = Integer.parseInt(st.nextToken()); //첫번째 호출
int b = Integer.parseInt(st.nextToken()); //두번째 호출

String array[] = s.split(" "); //공백마다 데이터 끊어서 배열에 넣음

Read한 데이터는 Line단위로만 나눠지기에  공백단위로 데이터를 가공하려면 따로 작업을 해줘야 하는데 위의 두가지 방법이 대표적이다.

  1. StringTokenizer에 nextToken() 함수를 쓰면 readLine()을 통해 입력받은 값을 공백단위로 구분하여 순서대로 호출할 수 있다.
  2. String.split() 함수를 활용하여 배열에 공백단위로 끊어서 데이터를 넣고 사용하는 방식이다.

 

BufferedWriter
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); //할당된 버퍼에 값 넣어주기
String s = "abc"; //출력할 문자열
bw.write(s+"\n"); //버퍼에 있는 값 전부 출력
bw.flush(); //남아있는 데이터를 모두 출력시킴
bw.close(); //스트림을 닫음
  • BufferedWriter의 경우 버퍼를 잡아놓았기 때문에 반드시 flush(), close()를 반드시 호출해줘 뒤처리를 해줘야 한다.
  • bw.write에는 System.out.println();과 같이 자동개행기능이 없기 때문에 개행을 해줘야 할 경우에는 \n을 통해 따로 처리해줘야 한다.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;


// 빠른 A+B 
public class Main {

    public static void main(String[] args) throws IOException {
       //Java를 사용하고 있다면, Scanner와 System.out.println 대신 BufferedReader와 BufferedWriter를 사용할 수 있다. 
       //BufferedWriter.flush는 맨 마지막에 한 번만 하면 된다.
        
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        int T = Integer.parseInt(br.readLine());
        
        StringTokenizer st;
        
        for(int i=1; i<=T; i++) {
            st = new StringTokenizer(br.readLine(), " ");
            bw.write((Integer.parseInt(st.nextToken()) + Integer.parseInt(st.nextToken())) + "\n");
        }
        br.close();
        
        bw.flush();
        bw.close(); 
  
    }
}

 

아직 익숙하지 않아서 자주 써봐야겠다.

BELATED ARTICLES

more