프로그래밍 언어/Java

[Java] 입력(BufferedReader)

김꿍디꿍디 2024. 10. 31. 23:54
반응형

Scanner와 BufferedReader의 차이

Scanner은 입력 문자를 공백 혹은 개행문자(enter)로 구분한다.

 

BufferedReader은 개행문자(enter)로만 구분 후 버퍼 공간에 저장해 두었다가 한번에 내보내서 빠르다. 

대신 한번에 입력받은 값을 나눠줘야해서 코드가 길어진다는 단점이 있다.

입력 속도 비교 (https://www.acmicpc.net/blog/view/56)

import

import java.io.BufferedReader

선언

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

 

입력

String s = br.readLine();
int i = Integer.parseInt(br.readLine());

 

입력은 readLine();이라는 메소드를 사용한다. 

String으로 리턴 값이 고정되어 있기 때문에, 다른 타입으로 입력을 받고자 한다면 반드시 형변환이 필요하다.

이 과정에서 IOException이 발생할 수 있다.

IOException 예외 처리

main 함수에 예외 처리를 해주거나

public static void main(String[] args) throws IOException {

}

 

사용 구문에 try ~ catch 문을 써주어야 한다.

public static void main(String[] args) {
	try {
    	// ...
    } catch (IOException e) {
    	// ...
    }
}

 

데이터 가공

BufferedReader를 통해 읽어온 데이터는 개행문자 단위(Line 단위)로 나누어진다.

만약 이를 공백 단위로 데이터를 가공하고자 하면 따로 작업을 해주어야 한다.

이때 사용하는 것이 StringTokenizer나 String.split() 함수이다.

// StringTokenizer 
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());

// String.split() 함수
String arr[] = s.split(" ");

 

 

StringTokenizer의 nextToken() 함수를 쓰면 readLine()을 통해 입력 받은 값을 공백 단위로 구분하여 순서대로 호출할 수 있다.

String.split() 함수를 사용하면, 배열에 공백단위로 끊어 데이터를 저장하여 사용할 수 있다.

예시

첫번째 줄에 int W, N이 주어진다.

i+1번째 줄에 i번째 금속의 무게 Mi와 무게당 가격 Pi가 주어진다.

100 2 
90 1
70 2

 

W, N을 각각 int 변수에 저장하고,

Mi, Pi를 2차원 배열에 저장하는 예시이다. 

import java.io.*;
import java.util.*;

public class Main {

    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);

        // StringTokenizer 
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        // 첫 줄 
        StringTokenizer st = new StringTokenizer(br.readLine());
        // 첫 줄을 w, n으로 구분하여 저장한다.
        int w = Integer.parseInt(st.nextToken());
        int n = Integer.parseInt(st.nextToken());

        int [][] list = new int[n][2];	

        for(int i=0; i<n; i++) {
        	// i+1번째 줄 
            st = new StringTokenizer(br.readLine());
            // i+1번째 줄을 m, p로 구분하여 저장한다.
            int m = Integer.parseInt(st.nextToken());
            int p = Integer.parseInt(st.nextToken());

            list[i][0] = m;
            list[i][1] = p;
        }
        
		// ...
    }
}

참고

https://rlakuku-program.tistory.com/33

 

[Java] 빠른 입출력을 위한 BufferedReader, BufferedWriter, StringTokenizer, StringBuilder

BufferedReader / BufferedWriter BufferedReader와 BufferdWriter는 버퍼를 사용하여 읽기와 쓰기를 하는 함수이다. 버퍼를 사용하지 않는 입력은, 키보드의 입력이 키를 누르는 즉시 바로 프로그램에 전달된다.

rlakuku-program.tistory.com

https://intshc.tistory.com/48

 

자바 BufferedWriter & BufferedReader 사용방법

자바로 백준 풀 때 맞는 알고리즘을 짜도 시간이 초과하는 경우가 있다. 보통 입력은 Scanner, 출력은 System.out.println()로 작성하지만 이게 좀 느리다.. 백준 님이 언어별로 입력속도와 출력속도(링

intshc.tistory.com

 

반응형