[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() 메소드는 읽어들일 요소가 있는 여부를 반환한다.

    • hasNext()로 읽어들일 수 있는 입력이 있다면 true를, 그렇지 않다면 false를 반환한다.

    • 예제는 아래와 같다.

    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를 이용하는 방법으로 코드를 짜야겠다!


'JAVA' 카테고리의 다른 글

[JAVA] 조합(Combination) 구현  (0) 2018.11.23
[JAVA] ArrayList 배열로 바꾸기  (0) 2018.11.21
[JAVA] 이진탐색트리  (1) 2018.10.09
[JAVA] Scanner함수 next(), nextLine() 차이  (0) 2018.09.20

+ Recent posts