본문 바로가기
Algorithm(코딩테스트)/코딩테스트 | 기초 개념 시리즈

[JAVA] 코딩테스트 입출력 패턴 정리 (Scanner VS BufferedReader)

by 카랑현석 2024. 11. 24.

결론

1. 출력 : System.out.println() 으로 출력하는 것보다 BufferedWriter 로 출력하는 것이 빠르다.

2. 입력 : Scanner 로 입력받는 것보다 BufferedReader 로 입력받는 것이 빠르다.

1. 출력
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

- bw.write()  문자열로 출력한다.

- 그래서 정수, 실수를 출력할 때는 형변환이 필요하다.

int/double -> String으로 바꾸고 출력 bw.write(""+5);
bw.write(""+3.1415926535);
문자 출력
(그대로 출력 가능)
bw.write('a');

 

- [자주 사용] C언어의 형식 지정자를 사용하여 출력하고 싶으면 String.format() 사용 

- 템플릿처럼 암기

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 출력을 위한 객체 생성

        double ft = 30.48;
        int mi = 160934;
		
        // bw.write() - 출력할 것을 담아 두기
        bw.write(String.format("9.2ft = %.1fcm\n", 9.2*ft));
        bw.write(String.format("1.3mi = %.1fcm", 1.3*160934));

    // bw.flush() - 출력하기
        bw.flush();
        
        // BufferedWriter 닫기
        bw.close();
    }
}

 

2. 입력
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

- br.readLine() 은 한 줄을 문자열로 입력받는다.

- 그래서 정수, 실수, 문자를 입력받을 때는 형변환이 필요하다.

 

- StringTokenizer(문자열, 분리할 문자); 는 문자열을 분리할 문자열을 기준으로 나눠서 저장한다.

예를 들어 StringTokenizer("a:b:c", ":"); 라고 하면 :을 기준으로 문자열을 분리하므로 a b c 가 각각 저장된다.

문자열 -> 정수로 변환 int a = Integer.parseInt(br.readLine());
문자열 -> 실수로 변환 double a = Double.parseDouble(br.readLine());
문자열 -> 문자로 변환 String input = br.readLine(); // 한 줄 입력 받기

char c = input.charAt(0); // 문자열의 첫 번째 문자 가져오기

 

유형 1 : 한 개 입력 받기

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));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        int a = Integer.parseInt(br.readLine()); // 입력 받고 정수형으로 변환하여 a 변수에 저장
        bw.write(""+a);
        bw.flush();
        bw.close();
    }
}

 

유형 2 : 공백을 사이에 두고 입력

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));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        String input = br.readLine(); // 입력 받기

        StringTokenizer st = new StringTokenizer(input, " "); // 공백(" ") 을 기준으로 분리
        int a = Integer.parseInt(st.nextToken()); // 첫 번째 값
        int b = Integer.parseInt(st.nextToken()); // 두 번째 값

        bw.write(String.format("%d", a*b));
        bw.flush();
        bw.close();
    }
}

 

1과 59를 각각 입력받아서 저장해야 한다.

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));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        String input = br.readLine(); // 입력 받기
        StringTokenizer st = new StringTokenizer(input, ":"); // :을 기준으로 분리해서 저장

        int clock = Integer.parseInt(st.nextToken()); // 첫 번째 입력받은 것을 clock 변수에 저장
        int minute = Integer.parseInt(st.nextToken()); // 두 번째 입력받은 것을 minute 변수에 저장

		// 출력
        bw.write(String.format("%d:%d", clock, minute));
        bw.flush();
        bw.close();
    }
}

 

 

유형 3 : N*M의 격자 입력

" " 로 공백을 구분하여 입력 받는다.

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));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		// 첫째줄의 N, M 입력 받기
		StringTokenizer FirstLine = new StringTokenizer(br.readLine()); // " "을 기준으로 나눈다.
		int N = Integer.parseInt(FirstLine.nextToken());
		int M = Integer.parseInt(FirstLine.nextToken());
		
		int[][] board = new int[N][M];
		
		// N개 줄에 대해서 M개 입력 받기
		for(int r=0; r<N; r++) {
			StringTokenizer st = new StringTokenizer(br.readLine()); // " "을 기준으로 나눈다.
			for(int c=0; c<M; c++) {
				board[r][c] = Integer.parseInt(st.nextToken());
			}
		}
		
		// 출력
		for(int r=0; r<N; r++) {
			for(int c=0; c<M; c++) {
				bw.write(board[r][c] + " ");
			}
			bw.write("\n");
			bw.flush();
		}	
		bw.close();
	}
}

 

한 줄을 입력받고 문자로 바꾼 다음 숫자로 바꿔 입력을 받는다.

package hihi;

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

public class Sol5 {

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		// 첫째줄의 N, M 입력 받기
		StringTokenizer FirstLine = new StringTokenizer(br.readLine());
		int N = Integer.parseInt(FirstLine.nextToken());
		int M = Integer.parseInt(FirstLine.nextToken());
		
		int[][] board = new int[N][M];
		
		// N개 줄에 대해서 M개 입력 받기
		for(int r=0; r<N; r++) {
			String inputLine = br.readLine();
			for(int c=0; c<M; c++) {
            	// 문자열 -> 문자 변환 (charAt()) | 문자 -> 숫자로 변환 (문자-'0')
				board[r][c] = inputLine.charAt(c) - '0'; 
			}
		}
		
		// 출력
		for(int r=0; r<N; r++) {
			for(int c=0; c<M; c++) {
				bw.write(board[r][c] + " ");
			}
			bw.write("\n");
			bw.flush();
		}	
		bw.close();
	}
}

 

유형 4 : EOF까지 입력

 

- EOF 입력 시 br.readLine()은 null을 반환한다는 것을 이용

 

 

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));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		String input;
		while((input = br.readLine()) != null) { // EOF 까지 입력 (EOF 입력 시 br.readLine()은 null 반환)
			// 출력
			int a = Integer.parseInt(input);
			bw.write(String.format("%d", a));
		}
		
		bw.flush();
		bw.close();
	}
}