올해부터 자바 공부를 시작하면서, 백준 알고리즘 문제도 자바로 풀어보면 좋을 것 같았다.
첫 난관은 입력값을 받는 문제였다.
입력은 Scanner 또는 BufferedReader 객체로 받을 수 있다.
첫 선택은 Scanner 였다.
1. Scanner
파이썬은 입력을 받으면 문자열이지만, 자바는 Scanner 객체로 받게 된다.
그래서 Scanner 객체를 기본(원시 primitive) 타입으로 바꾸는 작업이 필요하다.
Scanner로 받은 객체는 nextInt()
로 int
를, next()
로 String
를 받을 수 있다.
그리고 nextInt()
, next()
는 공백을 기준으로 값을 입력 받는 반면,
nextLine()
은 개행을 기준으로 값을 입력받는다.
import java.util.Scanner;
public class InputExample1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int number = scanner.nextInt(); // 정수, 공백 기준
//String str1 = scanner.next(); // 문자열, 공백 기준
//String str2 = scanner.nextLine(); // 문자열, 개행 기준
}
}
Scanner는 사용법이 쉽지만, 알고리즘 문제를 풀 때는 주로 BufferedReader 를 많이 쓴다.
왜냐하면 빠르기 때문이다.
(BufferedReader는 문자열을 그대로 읽으므로 별다른 정규식 검사 과정이 없기 때문에 Scanner보다 성능이 우수하다)
참고: https://st-lab.tistory.com/41
2. BufferedReader
BufferedReader를 사용하려면, main
메소드에서 IOException
예외를 선언해야 한다.
Scanner 와 달리 BufferedReader는 문자열 그대로 읽기 때문에
행 단위로 문자열을 받는 readLine()
을 이용해야 한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class InputExample2 {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String str = reader.readLine();
System.out.println(str);
}
}
공백 단위로 입력 값이 들어오기 때문에 문자열을 분리하는 작업을 따로 진행해야 한다.
문자열 분리는 split()
또는 StringTokenizer
를 이용한다.
3. 문자열 분리 - split
split(" ")
으로 공백을 기준으로 구분하면 문자열 배열을 반환한다.
public class InputExample3 {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String str = reader.readLine();
String[] strings = str.split(" ");
for(String string : strings) {
System.out.println(string);
}
}
}
split()
의 두번째 인자는 배열의 크기를 결정한다.
즉, split(" ", 2)
로 입력하면, 첫번째 공백을 기준으로 문자열을 구분한 뒤 크기 2인 배열에 담아서 반환하게 된다.
4. 문자열 분리 - StringTokenizer
StringTokenizer
를 사용하면 nextToken()
으로 문자열을 구분자 기준으로 값을 받아올 수 있다.
public class InputExample4 {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String str = reader.readLine();
StringTokenizer tokenizer = new StringTokenizer(str, " "); // 두번째 인자는 구분자
String string1 = tokenizer.nextToken();
int number1 = Integer.parseInt(tokenizer.nextToken());
System.out.println(string1);
System.out.println(number1);
}
}
위의 예시에서는 한 행에 공백을 기준으로 앞에는 문자열, 뒤에는 정수인 입력 값을 받을 때,
공백을 기준으로 값을 받아온 뒤, 두번째 인자는 정수로 parsing 하여 정수형으로 변환하면 된다.
'Java' 카테고리의 다른 글
[Java] 묵시적 형변환, 명시적 형변환 (0) | 2023.01.08 |
---|
댓글