[Java] BufferedReader, StringTokenizer

김동욱·2023년 3월 21일
0

Java

목록 보기
3/8

코딩 테스트를 풀 땐 Scanner 보다 BufferedReader 더 효율적이라는데 이를 자세하게 알아봅시다.
BufferedReader의 속도가 더 빠른 이유는 Buffer의 차이입니다.
Scanner는 1kb의 buffer를 가진 반면, BufferedReader는 8kb의 buffer를 가집니다.
그래서 입력을 저장했다가 한 번에 전송할 수 있기 때문에 더 빠른 속도를 낼 수 있습니다.

Scanner scan = new Scanner(System.in);
String str = scan.nextInt();

scanner는 위와 같이 사용합니다.
공백 및 개행(줄 바꿈) 기준으로 읽기 때문에 여러 줄이나 띄어쓰기로 구분된 숫자가 입력되면 그 만큼 scan.nextInt()를 사용해서 입력을 받아야합니다.

BufferedReader br new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();

BufferedReader는 위와 같이 사용합니다. 개행문자를 포함한 줄 단위로 입력받기 때문에 1 3 5 7 처럼 띄어쓰기된 숫자 배열도 그대로 입력받을 수 있습니다.
그렇기 때문에 위와 같이 띄어쓰기나 콤마(,)로 구분된 문자열을 분리하거나 특정 문자에 따라 문자열을 나누기 위해선 split()와 StringTokenizer 클래스를 사용해줘야 합니다.

StringTokenizer를 사용하는 방식은 아래와 같습니다.

//띄어쓰기로 구분
StringTokenizer st = new StringTokenizer(문자열);
//구분자로 구분
StringTokenizer st = new StringTokenizer(문자열, 구분자);

StringTokenizer 클래스의 메소드를 알아보면
hasMoreToken(): 사용할 수 있는 토큰이 더 남아있는지 확인합니다. 남아있으면 True, 아니면 False를 반환합니다.
nextToken(): 다음 토큰을 불러주는 메소드입니다.

public class Main{
    public static void main(String args[]) throws IOException {
        String str = "가나 다라 마바 사";
        StringTokenizer st = new StringTokenizer(str);

        while(st.hasMoreTokens()){
            System.out.println(st.nextToken());
        }
    }
}

문자열 str을 띄어쓰기 단위로 쪼갠 뒤 사용할 수 있는 토큰이 남아있는지 확인 후 남아있으면 다음 토큰을 출력해줍니다.
더 이상 남아있는 토큰이 없으면 false를 반환하고 while문을 종료하게 됩니다.

그러면 이를 통해 띄어쓰기 및 줄바꿈된 입력을 BufferedReader와 StringTokenizer를 가지고 처리하면 다음과 같습니다.

[입력 예시]
5
1 3 5 7 9

public class Main{
    public static void main(String args[]) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

//String 으로 입력받기 때문에 int형으로 형변환을 해줘야 합니다.
        int a = Integer.parseInt(br.readLine());
        int[] arr = new int[a];

//입력받은 내용을 띄어쓰기 단위로 쪼개줍니다.
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        while(st.hasMoreTokens()){
            System.out.println(st.nextToken());
        }
    }
}
profile
안녕하세요. 공부해요

0개의 댓글