알고리즘
[Java] 알고리즘 Day1
Jaemin0604
2024. 7. 2. 14:07
자바 입력
1. 개요
- 일반적으로 자바에서는 Scanner를 사용하여 입력을 받습니다.
- 하지만 Scanner는 입력을 처리할 때 상대적으로 느립니다.
- 특히 많은 양의 입력을 처리해야 하는 경우, BufferedReader에 비해 성능이 떨어집니다.
- 따라서 코딩테스트에서 주로 사용되는 방법은 BufferedReader와 InputStreamReader입니다.
2. 자바의 입력 클래스
BufferedReader & InputStreamReader
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
- System.in -> 표준 입력 스트림으로, 사용자가 콘솔에 입력하는 바이트 데이터를 읽습니다.
- InputStreamReader() -> 바이트 스트림(System.in)을 문자 스트림으로 변환합니다. 즉, 사용자가 입력한 바이트 데이터를 문자 데이터로 변환합니다.
- BufferedReader() -> InputStreamReader로부터 문자 데이터를 읽고 이를 버퍼링하여 효율적으로 처리할 수 있도록 합니다.
- br.readLine() -> 사용자가 입력한 한 줄의 문자열을 읽어 반환합니다.
StringTokenizer
StringTokenizer st = new StringTokenizer(str);
- 문자열을 공백이나 ,와 같은 구분자를 기준으로 분리하는 데 사용되는 클래스입니다.
- 문자열을 토큰 단위로 분리하여 쉽게 처리할 수 있게 해줍니다.
- 기본 구분자는 공백
더보기
StringTokenizer vs split()
- StringTokenizer는 내부적으로 정규 표현식을 사용하지 않기 때문에 상대적으로 빠르지만 기능이 제한적이며, 복잡한 구분자나 조건을 처리하기 어렵습니다.
- split은 정규 표현식을 사용하여 문자열을 분리하기 때문에 더 유연하고 강력한 기능을 제공하지만 StringTokenizer보다 느립니다.
여러가지 입력에 대한 처리 예시
1. 입력: 1 2 3 4 5 -> int 배열
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
StringTokenizer st = new StringTokenizer(str);
int[] input = new int[5];
for (int i = 0; i < 5; i++) {
input[i] = Integer.parseInt(st.nextToken()); // "1" -> 1, "2" -> 2....
}
System.out.println(Arrays.toString(input));
2.입력: 1 A 3 B 5 0 -> char 배열
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
StringTokenizer st = new StringTokenizer(str);
char[] input = new char[5];
for (int i = 0; i < 5; i++) {
input[i] = st.nextToken().charAt(0); // "1" -> '1', "2" -> 'A'....
}
System.out.println(Arrays.toString(input));
3. 입력: XYZQU -> 문자열을 char 배열로
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
char[] input = br.readLine().toCharArray();
System.out.println(Arrays.toString(input));
4.입력: 6 (n개)
1 2 3 4 5 1
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] input = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
input[i] = Integer.parseInt(st.nextToken());
}
System.out.println(Arrays.toString(input));
5. 입력: 5
XYZQU
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine()); // N
char[] input = br.readLine().toCharArray();
System.out.println(Arrays.toString(input));
6. 입력: 5
1 2 3 4 5
6 7 8 9 0
1 2 3 4 5
6 7 8 9 0
1 2 3 4 5
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
System.out.println(N);
int[][] input = new int[N][N];
for (int i = 0; i < N; i++) { // 행
StringTokenizer st = new StringTokenizer(br.readLine());
for (int j = 0; j < N; j++) { // 열
input[i][j] = Integer.parseInt(st.nextToken());
}
}
for (int i = 0; i < N; i++) { // 행
System.out.println(Arrays.toString(input[i]));
}
7. 입력: 3 5
1 2 3 4 5
6 7 8 9 0
1 2 3 4 5
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()); // "3 5"
int N = Integer.parseInt(st.nextToken()); // 3
int M = Integer.parseInt(st.nextToken()); // 5
int[][] input = new int[N][M];
for (int i = 0; i < N; i++) { // 행
st = new StringTokenizer(br.readLine());
for (int j = 0; j < M; j++) { // 열
input[i][j] = Integer.parseInt(st.nextToken());
}
}
for (int i = 0; i < N; i++) { // 행
System.out.println(Arrays.toString(input[i]));
}