2월 12, 2024

[Java, C++]입출력에서 코드시간 단축하는 꿀팁

 보통 알고리즘 문제를 풀다가 조금이라도 시간복잡도를 줄일 수 있는 효율적인 방법이 있을지에 대해 많이 고민한다. 대부분 알고리즘 자체를 고칠 생각을 많이 하는데 많이 고려하지 않는 입출력 부분에서 입력속도를 줄일 수 있는 몇 가지 팁이 있어서 공유하려고 한다.


1. Java

(1) 입력

자바의 경우 입력을 주로

Scanner sc=new Scanner(System.in);

위의 코드처럼 Scanner 스캐너를 사용하는데 스캐너의 경우 입력이 많은 경우에 속도가 느리다.

따라서 입력을 여러 번 지속적으로 받아야 하는 문제의 경우 scanner 대신 BufferedReader를 사용한다.

BufferedReader는 Scanner에 비해서 코드 길이가 조금 긴데,

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

이라고 코드를 써주면 된다. 

 

BufferedReader를 써줄 때 주의하여야 할 점은 뒤에 class 등의 뒤에 throws IOException 을 꼭 써주어야 한다는 점이다. 그리고 추가로 import java.io.*; 를 해주어야 한다. 



(2) 출력

출력의 경우 자바는 주로 

System.out.println();

을 사용했다. 하지만 출력 또한 BufferedWriter를 사용하여서 출력속도를 높일 수 있다.

BufferedWriter br=new BufferedWriter(new OutputStreamWriter(System.out));

위와 같이 적어주고 import java.io.*; 를 추가로 적어주고 throws IOException 처리를 입력과 같이 해주면 된다. 

 

또한 출력의 경우 매번 System.out.println()을 사용하지 않고 StringBuilder를 사용하여 한 문자열로 출력해주는 것도 방법이다. 

 

StringBuilder는 일반적으로,

StringBuilder sb=new StringBuilder();
sb.append('a');

이런식으로 쓰면서 append를 해 주는 것이 일반적이다. 이렇게 하나의 문자열을 만들어주고 마지막에 출력을 한 번만 해주면 시간단축을 시킬 수 있다. 


 

2. C++

(1) 입력

C++의 경우 주로 cin을 사용하는데 cin보다 scanf가 더 빠른 방법이다. 따라서 입력이 많은 문제의 경우 cin 대신 scanf를 사용해주는 것이 좋다



(2) 출력

주로 출력을 할 때 cout을 사용하는데 cout보다 printf가 더 빠른 방법이다. 또한 만약 cout을 쓴다면 주로 'endl'을 많이 사용하는데 이보다 '\n' 을 사용하는 것이 훨씬 시간을 더 단축시킬 수 있다. 물론 둘다 줄바꿈을 의미하는 같은 의미지만 시간 차이는 10배 가량 난다. endl을 사용하면 시간초과가 뜨는데 이를 '\n'으로 바꾸면 시간초과문제가 해결되는 알고리즘 문제도 몇개 접해보았다. 

 

만약 scanf/printf를 쓰기 싫고 cin/cout을 쓰고 싶다면

ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);

위의 세 줄 코드를 추가해주면 scanf/printf를 쓰는 효과처럼 빨라진다는 장점이 있다.

 


이렇게 같은 입력과 출력을 받는 것이라고 해도, 다양한 방법에 따라서 코드의 속도는 천차만별이다. 시간이 크게 중요하지 않다면 같은 결과를 내는 것 중 자신이 편한 것을 사용하면 되겠지만, 시간을 단축시키는 것이 중요한 문제는 입/출력에서조차 단축시킬수 있는 방법이 있다는 것을 알아두자.