코딩 테스트에서 시간 초과를 자주 마주치게 됩니다.
최적화를 위해 입출력 방식부터 최적화가 가능하지 점검해보는 것이 좋은데 일반적으로 많이 사용하는 Scanner와 System.out.print 대신 BufferedReader와 BufferedWriter를 활용하면 처리 속도를 크게 향상할 수 있습니다.
(물론, 이전에 풀이 로직의 시간복잡도를 먼저 확인하고 최적화 하는것이 중요하겠습니다.)
입출력 데이터의 양이 많지 않다면 두 방법이 큰 성능 차이를 보이지 않지만, 입출력 데이터의 양이 많아질 수록 성능차이가 발생할 수 있다고 합니다.
아래는 1,000,000개의 정수를 입력받고 출력하는 데 걸리는 시간을 비교한 표입니다.
| 방식 | 입력 속도(초) | 출력 속도(초) | 총 소요 시간(초) |
| Scanner/System.out.print | 1.8 | 1.2 | 3 |
| BufferedReader/BufferedWriter | 0.3 | 0.3 | 0.6 |
성능차이가 발생하는 이유
Scanner는 입력할 때마다 필요한 자료형으로 변환하는 과정을 거치므로 처리 속도가 느려질 수 있습니다.
이후 사용하는 System.out.print는 출력이 발생할 때마다 버퍼를 비우는 작업이 이뤄지므로 성능이 저하될 수 있습니다.
반면 BufferedReader는 입력을 버퍼에 저장한 후 데이터를 한번에 읽어 오는 방식으로 I/O 작업 횟수를 줄여 성능을 향상합니다.
BufferedWriter도 마찬가지로 출력할 데이터를 버퍼에 저장한 후 한 번에 출력하는 방식으로 성능을 개선합니다.
write()함수로 데이터를 버퍼에 추가하고, flush()함수로 버퍼의 내용을 한꺼번에 출력함으로써 효율을 높입니다.
public class Main(){
public static void main(String[] args) throws IOException{
Scanner sc = new Scanner(SYstem.in);
int a = sc.nextInt();
Systemout.println(a);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int b = Integer.parseInt(br.readLine());
bw.write(String.valueOf(b)); // 정수를 String형으로 변환하여 출력
bw.flush();
}
}
'Java > Basic' 카테고리의 다른 글
| 인텔리제이 환경에서 인풋데이터 메모장으로 처리하기 (0) | 2025.03.04 |
|---|---|
| Jar 파일과 War 파일 알아보기 (1) | 2025.01.20 |
| Garbage Collection 알아보기(작성 중) (3) | 2025.01.08 |
| JVM(Java Virtual Machine) (3) | 2025.01.06 |