JAVA 당

[JAVA] 열받는 자바문법 : Scanner, BufferedReader

이히당 2023. 6. 21. 01:45

일단, 알고리즘 문제를 풀 때, 초기에 입력해야하는 값이 있다.

입력을 받을 때 나는 주로 Scanner를 이용했다.

참고로 import java.util.*; 혹은 import java.util.Scanner;를 꼭 써주자

package Main;

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

public class Main {
	
	public static void main(String[] args) throws IOException {
    	Scanner sc = new Scanner(System.in);
    	
    	int A = sc.nextInt();
		int[] arr = new int[A];
        
        for (int i = 0; i < A; i++) {
        	arr[i] = sc.nextInt();   
        }
	}

}

위의 코드는 정수인 A를 하나 입력받고, 크기가 A인 int형 배열을 만들어 각 인덱스에 빈칸을 기준으로 값을 입력받는 것이다.

5
4 1 6 4 0

대충 이 위에 있는 놈을 console창에 쓰면 알아서 원하는 자리에 들어가게된다.

이 방법이 편해서 그냥 이렇게 쓰고 있었는데, java로 문제푸는 사람들을 보면 저 BufferedReader를 엄청 많이 쓰더라.

그냥 무시하고 있었는데

백준문제를 풀때 계속 시간초과가 났다.

알고보니 이 Scanner을 사용하면, 시간을 많이 잡아먹는 것이었닥..ㅋㅋ...

(대략 속도가 5배 차이난다.)

 

밑에 관련 글을 넣겠다.

 

https://www.acmicpc.net/board/view/36932

 

글 읽기 - 자바에서 왜 BufferedReader가 Scanner보다 빠를까요?

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

 

여튼 BufferedReader가 시간적인 면에서 더 유리하다.

데이터를 파싱어쩌구 뭔 복잡스러운 내용이 많던데, 안궁금하지만.. 그래도 대충이라도 알아보자.

 

우선 이놈을 어떻게 사용하는 지 보도록하자

 

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


public class Main {
	public static int N;
	public static int K;
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    	StringTokenizer st = new StringTokenizer(br.readLine());
   
  
		N = Integer.parseInt(st.nextToken());
		int[] arr = new int[N];
		
       
		for(int i = 0; i<N; i++) {
        	//새로운 줄을 읽기위함
         	st = new StringTockenizer(br.readLine());
			arr[i] =  Integer.parseInt(st1.nextToken());

		}
        
        intp[][] map = new int[n][m];
		for(int i=0; i<n; i++) {
			String s = br.readLine();
			for(int j=0; j<m; j++) {
				map[i][j] = s.charAt(j) - '0';
			}
		}

	
	}
	

}

 

 

일단 정리를 해보자..

 

Scanner란?

Scanner 클래스는 입력받은 데이터(바이트)를 다양한 타입으로 변환하여 반환하는 클래스

 

System.in이란?
사용자로부터 입력을 받기 위한 입력 스트림

 

BufferedReader란?

데이터를 한번에 읽어와 버퍼에 보관한 후 버퍼에서 데이터를 읽어오는 방식으로 동작하는 클래스

readLine() 메서드는 한 줄을 다 가져오는 기능을 한다.

 

StringTokenizer?

문자열을 지정한 구분자로 문자열을 쪼개주는 클래스

 

다시 돌아와서 위의 코드는

3
1 4 6

 

특징을 간단히 말하면,

Scanner은 쓰기에는 간편한 대신 시간을 많이 잡아먹고,

BufferedReader은 시간은 적게 걸리는 대신, 형 변환에 신경을 써주어야 하고, 예외처리또한 해주어야 한다.

그러니까,

문제봐가면서 어떤 놈을 쓰는 게 더 유리할 지 적절히 판단해서,, 융통성 있게 사용하도록 하자..

애증의 java.

자바를 자바보자..아자아자..파이팅..

관련글

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

 

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

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

rlakuku-program.tistory.com

 

728x90