자바 언어로 알고리즘 문제를 풀 때, 문제에서 주어진 입출력 조건을 맞추기 위해 문제마다 반복적으로 어떤 값을 입력받는 코드를 작성해야 한다.
나는 처음에는 그냥 내가 알고있던 Scanner와 System.out.println()을 활용해서 입출력 부분 코드를 작성했다.
그런데 구글링을 하다 보니까 보통은 StringBuilder와 BuffererdReader를 많이 사용하길래 더 찾아본 기록을 남겨본다.
먼저, 출력 부분을 보자.
나는 뭔가의 결괏값을 반복해서 출력해야 할 때, 그냥 반복문에서 System.out.println()을 돌렸었다.
그런데 입출력 작업은 굉장히 느리고 자원 소모가 크기 때문에, 이렇게 하지 말고
모든 출력할 값들을 하나의 문자열로 만들어준 뒤, 그 값을 한 번에 출력하는 방식이 더 낫다.
그렇게 하기 위해 StringBuilder를 활용한다.
다음은 비교를 위한 일부 예시 코드이다.
// 이전 방식
for (int number : numbers) {
System.out.print(number + " ");
}
// StringBuilder를 활용한 방식
static StringBuilder sb = new StringBuilder();
public static void someFunction () {
for (int number : numbers) {
sb.append(val).append(' ');
}
sb.append('\n');
}
someFunction();
System.out.println(sb);
다음에는 입력부분이다.
BuffererdReader라는게 있는게 이게 Scanner보다 실행속도가 빠르다고 한다.
찾아보니 BuffererdReader는 버퍼를 이용해서 많은 양의 데이터를 읽고(즉, 입출력 횟수가 적으므로 속도가 더 빠름) Scanner는 실시간으로 데이터를 파싱하고 토큰화하므로 데이터 처리 속도가 더 느리다고 한다.
BuffererdReader, StringTokenizer를 활용하는 방법은 다음과 같다.
1. 새로운 BuffererdReader 객체를 만든다.
2. 위 객체를 통해 버퍼에서 한 줄을 읽어온다.
3. 읽어온 string을 분리해주기 위한 StringTokenizer객체를 만든다.
4. 위 객체에서 토큰을 읽어와서 새로운 변수에 저장한 후 활용한다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
참고로, StringTokenizer는 한 줄에 여러 개의 값을 공백으로 구분해서 처리할 때 유용하므로 입력형식이 `N M` 과 같을 때 사용한다.
만약 입력 형식이 `2\nword1\nword2` 과 같이 여러 줄에 걸쳐 주어진다면 그냥 BufferedReader.readLine()으로 한 줄씩 읽어와서 각각의 단어를 처리해주면 된다!