코딩 테스트에서 시간 초과를 자주 마주치게 됩니다.

최적화를 위해 입출력 방식부터 최적화가 가능하지 점검해보는 것이 좋은데 일반적으로 많이 사용하는 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();
    }
}

 

+ Recent posts