우선 나는 이번 포스팅에서 입출력이 빠른 버퍼 기능에 대해 약간은 자세하게 풀어볼 생각이므로,
긴 글을 싫어하시거나 프로그래밍을 공부한 지 얼마 안 되신 분이시라면 이번 글은 나가시는 걸 추천한다.
이번 문제를 시간 초과 없이 풀기 위해서 입출력 스트림에 대해 알아보도록 하자.
우선 알다시피 기존의 Scanner 클래스를 이용하여 문제를 풀면 다음과 같이 시간 초과가 발생할 것이다.
그럼 바로 BufferedReader를 이용한 코드를 올리겠다.
import java.io.*;
import java.util.StringTokenizer;
public class Step3_6 {
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 N = Integer.parseInt(br.readLine());
StringTokenizer st;
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine()," ");
bw.write((Integer.parseInt(st.nextToken()) + Integer.parseInt(st.nextToken()))+ "\n");
}
br.close();
bw.flush();
bw.close();
}
}
속도 차이가 발생하는 이유는 Scanner 클래스와 BufferedReader 클래스의
입력 스트림에서 데이터를 읽는 방식이 다르기 때문에 속도 차이가 발생할 수 있다는 것이다.
*입력 스트림이란, 프로그램으로 외부의 데이터를 읽어오는 것이라고 생각하면 된다.
더 쉽게 설명하자면, Scanner 클래스는 프로그램으로 외부의 데이터를 읽을 때 정규표현식을 사용한다. 이때 문자열을 파싱하고 변환하는 과정이 포함되어 처리 과정이 복잡하기 때문에 처리 속도가 느릴 수 있다.
반면에, BufferedReader 클래스는 데이터를 미리 버퍼라고 하는 일시적 메모리 영역에 저장해 놓고 데이터를 한 번에 읽어오니까 빠른 것이다.
그리고 BufferedReader는 입력을 담당하고, BufferedWriter은 출력을 담당한다.
Reader와 Writer의 이름 그대로의 역할을 하니, 쉽게 이해할 수 있다고 생각한다.
또한 BufferedReader, Writer에는 생성자에 입출력 스트림을 넣어야 한다.
입출력 스트림에 대한 기능을 제공하는 게 BufferedReader, Writer이기 때문이다.
또한 Buffered는 문자로만 읽어오는 특징이 있다. 그렇기에 입력값을 파씽하여 변수 N에 저장하였다.
StringTokenizer는 읽어온 문자열을 주어진 구분자를 기준으로 분리하는 역할을 하므로,
공백을 기준으로 각 문자열을 분리하였고, 첫 번째와 두 번째 문자열을 파씽 후 더한 값을, 출력 버퍼에 쓴다.
마지막으로 개행문자 "\n"을 사용하여 다음 출력값을 줄 바꿈 한다.
이번 포스팅은 최대한 간단하게 써보도록 노력했지만, 이해하는데 여러 불편이 있다고 생각한다.
앞으로 계속 포스팅하여 실력을 더 넓혀 더 정확하고 쉽게 설명하도록 노력하겠다.
'알고리즘 분류 > Step3 반복문' 카테고리의 다른 글
</Step3_8> 11022 A+B -8 JAVA (0) | 2023.03.12 |
---|---|
</Step3_7> 11021 A+B -7 JAVA (0) | 2023.03.12 |
</Step3_5> 25314 코딩은 체육과목 입니다 JAVA (0) | 2023.03.12 |
</Step3_4> 25304 영수증 JAVA (0) | 2023.03.12 |
</Step3_3> 8393 합 JAVA (0) | 2023.03.12 |