자바는... 느리다.
그런데 생각보다 빠르다.
일반적으로 알고리즘을 풀 때, 자바의 경우는 scanner를 자주 사용한다. 아무래도 여러가지 부가기능이 붙어있으므로 사용하기 편한면 때문에 다들 많이 사용하는 것 같다.
다만, 자바의 경우 입력이 많을 때 , scanner를 써서 시간초과가 날 수 있다. 뿐만 아니라 그때 그때 출력할 경우에도 시간 초과가 날 수 있다.
오늘의 완죤 쉬운 문제 하나를 소개하겠다.
이름하야 수 정렬하기3 https://www.acmicpc.net/problem/10989
솔루션은 간단한데, 직접 정렬을 할 경우 시간초과에 걸리게 된다. N 사이즈가 천만이기 때문에, log조차 붙이는게 조심스럽다.
그런데 보면 최대 값이 10000이다 따라서 카운팅소트를 진행하시면 되겠다.
근데 이문제의 핵심은 이거라기보다...
인풋을 얼마나 빨리 받을 수 있냐에 있다.
자바용 쓸만한 빠른속도로 입력받기 소스를 소개하겠다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringBuilder sb = new StringBuilder(); int N = Integer.parseInt(br.readLine()); int[] arr = new int[10010]; for (int i = 0; i< N;i++){ arr[Integer.parseInt(br.readLine())]++; } for(int i =0; i<= 10000; i++){ while(arr[i] != 0){ sb.append(""+i+"\n"); arr[i]--; } } System.out.println(sb.toString()); } } | cs |
한꺼번에 모아서 입력을 받고 한꺼번에 모아서 출력한다. 라는 쉬운 개념인데, c++의 scanf, printf 보다 성능이 좋다.
이런 쉬운 것에 불필요한 설명을 덧붙이는 것은 좀 귀찮으니... 다들 소스코드 이해하는데 문제 없으리라 보고 이정도만 포스팅 하도록 하겠다.
다만 주의할 것이 StringBuilder를 사용하지 않고 string간의 +연산을 사용할 경우,
자바를 아시는 분들은 아실 수도 있지만, 당연히 시간 초과가 난다. String간 + 연산에 관해서는 검색해서 찾아보시길 바랍니다.
'Problem Solving > 기본' 카테고리의 다른 글
Python으로 알고리즘 문제 쉽게 풀기 (1) - input 받기 잡기술 (0) | 2021.04.01 |
---|---|
문제 만들기 TestCaseGenerator와 output 만들기 (0) | 2017.08.06 |
[C++] 연산자 오버로딩 (0) | 2016.11.29 |
C에서 C++로 넘어가기 - 시작 (0) | 2016.11.21 |
알고리즘 사이트 별 장/단점 총정리 (0) | 2016.10.19 |