[JAVA] 입력 클래스
입력의 범위가 주어지지 않은 경우
백준 5639 문제(https://www.acmicpc.net/problem/5639)를 풀다 입력의 개수가 주어지지 않고 입력이 끝날 때 까지 입력을 받아 처리해야하는 경우를 보았다.
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
for(int i=0; i<N; i++){
}
대부분 Scanner를 이용한 위와 같은 방법으로 입력을 처리했기 때문에 java에서 입력을 처리하는 다른 방법을 알아야할 필요성을 느끼게 되었다.
java의 키보드 입력받는 방법
자바에서 키보드의 입력을 받아 처리하는 방법은 크게 두 가지가 있다.
1) Scanner를 이용하는 방법
2) BufferedReader를 이용하는 방법
- 한 줄 단위로 버퍼에서 읽을 수 있는 readLine() 함수가 있으므로, 공백 단위로 입력이 들어올 때에는 StringTokenizer를 이용하여 각각의 문자열을 처리한다.
-> Scanner는 이용은 편리하나, 입력이 여러개가 되면 그 때마다 sc.next~() 함수를 실행해줘야하므로 시간이 많이 소요된다는 단점이 있다.
Scanner의 hasNext() 메소드
boolean hasNext()
메소드는 읽어들일 요소가 있는 여부를 반환한다.
Scanner sc = new Scanner(System.in);
ArrayList<Integer> arr = new ArrayList<>();
while(sc.hasNext()){
arr.add(sc.nextInt());
}
for(int i=0; i<arr.size(); i++)
System.out.println(arr.get(i));
BufferedReader을 이용한 입력 처리
BufferedReader는 문자(char)단위로 읽어들이는 InputStreamreader에 버퍼링 기능을 추가한 것으로, 한 번에 입력을 받아들여 버퍼에 저장한 후 사용자가 요구할 때 버퍼에서 읽어온다.
예외를 던질 수 있는 BufferedReader를 사용하기 위해서는 예외를 처리해 주어야한다.
(try-catch문 사용 / throw IOException)
백준 15552 : 빠른 A+B 문제
BufferedReader를 이용해 입력을 받고 BufferedWriter를 이용해 결과를 출력하는 문제
1) 먼저 두 객체를 생성해준다.
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
2) BufferedReader를 이용하면 전체의 입력이 버퍼에 저장되므로, 버퍼에서 한 줄씩 읽어오는 readLine() 메소드를 이용한다.
해당 문제에서는 A+B 2개를 입력받기 때문에 String으로 읽고, split함수를 이용해 나눠주었다.
String line = in.readLine();
nums = line.split(" ");
int result = Integer.parseInt(nums[0]) + Integer.parseInt(nums[1]);
3) 결과값을 버퍼에 쓴다.
버퍼에 String 값을 쓰는 wirte() 메소드와 개행문자(\n)를 입력하는 newLine() 메소드를 이용하였다.
out.write(String.valueOf(result));
out.newLine();
4) 버퍼에 쓴 값을 콘솔에 출력하고, BufferedReader와 BufferedWrite를 닫아준다.
out.flush();
in.close();
out.close();
[전체코드]
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
int testcase = Integer.parseInt(in.readLine());
while(testcase > 0){
String nums[] = new String[2];
String line = in.readLine();
nums = line.split(" ");
int result = Integer.parseInt(nums[0]) + Integer.parseInt(nums[1]);
out.write(String.valueOf(result));
out.newLine();
--testcase;
}
out.flush();
in.close();
out.close();
}
}
Scanner를 입력하는 것과 BufferdReader를 이용하는 것의 시간차이가 많으므로 앞으로는 BufferedReader를 이용하는 방법으로 코드를 짜야겠다!