백준 알고리즘을 풀며 알게된 점을 메모한 게시물입니다.
처음 백준을 풀기 시작해보니 코드 처리 속도가 중요하다는 것을 알게 되었다.
오늘은 Scanner와 BufferedReader 차이점과 StringTokenizer와 split의 차이점에 대해 메모한다.
문제는 두 수의 입력을 받고 두 수의 차이값을 출력하는 간단한 문제이다.
백준 문제 1001번
: 두 정수 A와 B를 입력받은 다음, A-B를 출력하는 프로그램을 작성하시오.
입력
: 첫째 줄에 A와 B가 주어진다. (0 < A, B < 10)
출력
: 첫째 줄에 A-B를 출력한다.
import java.util.*;
public class Main{
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
int a,b;
a = sc.nextInt();
b = sc.nextInt();
System.out.println(a-b);
}
}

Scanner 클래스를 이용해서 두 수를 nextInt()로 간단하게 읽어왔고, 속도는 212ms 정도 걸렸다.
import java.io.*;
public class Main{
public static void main(String args[]) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] s = br.readLine().split(" ");
int a = Integer.parseInt(s[0]);
int b = Integer.parseInt(s[1]);
System.out.println(a-b);
}
}

BufferedReader를 이용해 입력한 값을 읽어왔고, 입력한 값을 분리하는 과정을 거쳤다. 이 경우 처리속도가 120ms 정도이다.
왜 이런 속도차이가 나는 것일까?

데이터 가공
버퍼 사용
👉 데이터를 하나하나 전달하는 것보다 한번에 모아 데이터를 전송하는 것이 성능적인 측면에서 더 효율적이다. 따라서 버퍼의 사용이 더 빠른 처리 속도를 낼 수 있다.
BufferedReader 사용할 때 주의점
throws IOException으로 예외처리를 해준거나 try, catch문 으로 예외처리를 해줘야한다.split() 함수를 사용해주거나 StringTokenizer 클래스를 이용한다.split () 을 이용하여 문자열을 구분해주었다.StringTokenizer 클래스 사용해서 문자열을 구분할 때
import java.util.*;
import java.io.*;
public class Main{
public static void main(String args[]) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
System.out.println(a-b);
}
}
StringTokenizer 클래스는 java.util 패키지에 있고, split () 처럼 문자열을 분리해준다. 분리된 문자열을 nextToken()으로 가져올 수 있다. 분리된 모든 문자열을 확인하기 위해서는 hasMoreTokens() 을 이용하여 반복문을 돌면서 확인하는 방법이 있다.
StringTokenizer를 생성하는 방법 3가지도 알아보자.
StringTokenizer st = new StringTokenizer(문자열);
👉 띄어쓰기를 기준으로 문자열을 분리해준다.
StringTokenizer st = new StringTokenizer(문자열, 구분자);
👉 명시한 구분자로 문자열을 분리해준다.
StringTokenizer st = new StringTokenizer(문자열, 구분자, true/false);
👉 세번째 매개변수의 true/false는 구분자를 토큰에 포함할지 여부를 결정한다. true면 구분자를 토큰에 포함되고, false면 포함되지 않는다.
참고 게시물