코딩 테스트를 풀 땐 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 9public 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()); } } }