[JAVA] 백준_15552

BufferedReader, BufferedWriter, StringBuilder, StringTokenizer, split

Posted by iheese on April 23, 2022 · 7 mins read

15552

  • 빠른 A+B 입출력 문제
  • 자바 1.5초의 시간 제한이 있다.
  • 평상시대로 Scanner를 사용하면 시간 제한에 걸린다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class BJ15552{
	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++){
            String s =br.readLine();
            int a =Integer.parseInt(s.split(" ")[0]);
            int b =Integer.parseInt(s.split(" ")[1]);
            bw.write(a+b+"\n");
        }
        br.close();
       // bw.flush();
        bw.close();
    }
}
  • BufferedReader, BufferedWriter를 이용해서 문자열을 받아서 한번에 입출력했다. :1080ms

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 BJ15552{
	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());
        
        StringTokenizer st;
        
        for(int i=0; i<n;i++){
            st =new StringTokenizer(br.readLine()," ");
            int a =Integer.parseInt(st.nextToken());
            int b =Integer.parseInt(st.nextToken());
            bw.write(a+b+"\n"); //버퍼에 값이 쌓인다.
        }
        br.close();
        //bw.flush();
        bw.close();  //출력!
    }
}
  • BufferedReader, BufferedWriter, StringTokenizer 를 사용했다. :860ms
  • split과 StringTokenizer을 이용했을 때 StringTokenizer가 성능이 좋았지만 공홈에서는 split을 권장하고 있다고 한다. Reference에 관련한 글을 첨부해놓겠다.
  • flush() 는 스트림의 남아있는 버퍼를 강제적으로 출력하는 기능이다.
  • close()는 먼저 flush() 실행 후 스트림을 닫는 기능이다.
    • 스트림을 사용하고 있는데 버퍼를 비워야 할 때 flush() 사용하면 될 것 같다.
  • BufferedReader의 경우 close() 명시해주지 않아도 Garbage Collector에 의해 내부 객체가 정리가 된다.
  • 그러나 BufferedWriter는 Writing을 하고 나서 적절하게 close()을 해주지 않으면 Writing에 오류가 생길 수 있다.
  • 자원 관리를 위해 close()와 flush()를 잘 이용해야한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class BJ15552{
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine());
        
		StringBuilder sb = new StringBuilder();
        
		for (int i = 0; i < n; i++) {
			String s=br.readLine();
			int a=Integer.parseInt(s.split(" ")[0]);
			int b=Integer.parseInt(s.split(" ")[1]);
			sb.append(a+b+"\n");
		}
		br.close();
		System.out.println(sb);
	}
}
  • StringBuilder와 split 이용 : 1120ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BJ15552{
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		 
		int n = Integer.parseInt(br.readLine());
        
		StringTokenizer st;
		StringBuilder sb = new StringBuilder();
        
		for (int i = 0; i < n; i++) {
			st = new StringTokenizer(br.readLine()," ");
			sb.append(Integer.parseInt(st.nextToken()) + Integer.parseInt(st.nextToken())).append('\n');
		}
		br.close();
 
		System.out.println(sb);
 
	}
}
  • StringBuilder와 StringTokenizer 이용 : 824ms
  • 데이터 양이 100만개 이상되면 BufferedWriter가 더 빠르다.


Reference: