원래는 파이썬으로 코딩테스트 문제를 간간히 풀었었는데, 여기저기서 언어를 자바로 제한해버리는 바람에 급하게 자바로 코테를 준비하게 되었다.
이번에 준비하는 코테는 직접 입출력을 해주어야 하는 환경이라 간단하게 입출력을 위한 내용들을 정리해 보았다.
입력
Scanner를 사용한 입력 방법은 스킵 하겠다.
BufferedReader
단순히 Java에서 BufferedReader가 Scanner보다 성능이 좋다고 알고있어서, 궁금해서 좀 찾아보니 차이가 좀 있었다.
"그래서 왜 BufferedReader 쓰는데?"
BufferedReader는 한번에 여러 개의 문자를 읽는데에 비해, Scanner은 매번 한 문자씩 읽는다.
또한, Scanner는 단순히 문자열을 읽는 것 외에 추가적으로 제공하는 기능이 몇가지 있는데, 이것을 코테에서는 크게 써먹을일이 없다. 쓰지도 않을 기능을 포함한 함수를 사용하면 거기에 대한 오류처리 과정등... 비교적 많은 비용이 든다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String name = br.readLine();
int age = Integer.parseInt(br.readLine());
Split과 StringTokenizer
둘다 다음과 같은 입력을 받을때에 사용된다.
얘네 둘은 무슨차이임?
둘다 똑같은 목적으로 사용될 수 있다. 다만, StringTokenizer는 문자열을 여러개의 토큰으로 분리해 관리하기 위한 기능들을 제공하는 클래스이다.
그에 반해 split은 String 클래스에 속해있는 메소드로, 정규표현식으로 분리할 문자열들을 구분한다. 바로 이 정규표현식을 컴파일하고 매칭하는 과정때문에 코테에서 사용하기엔 무겁게 느껴진다.
// split() 메서드 예제
String str = "apple,orange,banana";
String[] fruits = str.split(",");
for (String fruit : fruits) {
System.out.println(fruit);
}
// apple
// orange
// banana
// StringTokenizer 예제
StringTokenizer tokenizer = new StringTokenizer("apple orange banana", " ");
while (tokenizer.hasMoreTokens()) {
System.out.println(tokenizer.nextToken());
}
// apple
// orange
// banana
중요한 점은 tokenizer.hasMoreTokens() 으로 아직 남아있는 토큰이 존재하는가? 를 확인하고, tokenizer.nextToken()로 나머지 토큰에 접근한다.
응용
그래서 이러한 문자열을 입력받을때는 어떻게 해야할까? 보통은 저렇게 첫줄에 케이스 개수를 던져주는 경우가 많다.
public static void main(String[] args) throws IOException {
// 입력
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int size = Integer.parseInt(br.readLine());
int[][] inputArr = new int[size][2];
for (int i = 0; i < size; i++) {
StringTokenizer tokenizer = new StringTokenizer(br.readLine(), " ");
while(tokenizer.hasMoreTokens()){
inputArr[i][0] = Integer.parseInt(tokenizer.nextToken());
}
}
}
'Web' 카테고리의 다른 글
자바 vs 노드 당신의 선택은?! (3) | 2025.01.18 |
---|---|
NestJS + TypeORM + Testcontainers 를 사용한 통합 테스트 DB환경 구축하기 (1) | 2025.01.17 |
Java record 에 대하여 (1) | 2024.03.10 |