결론
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();
}
}
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();
}
}