반응형
https://www.acmicpc.net/problem/2751
2751번: 수 정렬하기 2
첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.
www.acmicpc.net
[풀이]
(1) 처음에는 단순히 Arrays.sort()를 사용해 정렬을 하려고 했다. 그러나 Arrays.sort()는 퀵소트.. 평균 nlogn의 시간복잡도를 가지지만 최악의 경우 n^2 가 된다. N의 크기가 최대 1000000(백만)이므로 당연히 시간초과.
(2) 그래서 이 문제에서 시간복잡도 n의 카운팅정렬을 사용했다.
[코드]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class BJ_2751_수정렬하기2 {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
boolean[] temp = new boolean[2000001];
for(int n = 0; n < N; n++) {
int num = Integer.parseInt(br.readLine());
temp[num + 1000000] = true;
}
for(int n = 0; n < 2000001; n++) {
if(temp[n]) {
sb.append(n - 1000000).append("\n");
}
}
System.out.println(sb);
}
}
(참고) 틀린코드#1 - 시간초과
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class BJ_2751_수정렬하기2 {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(br.readLine());
int[] arr = new int[N];
for(int n = 0; n < N; n++) {
arr[n] = Integer.parseInt(br.readLine());
}
Arrays.sort(arr);
for(int n = 0; n < N; n++) {
System.out.println(arr[n]);
}
}
}
(참고) 틀린코드#2 - 역시나 시간초과.
Stringbuilder을 써줘야 시간초과가 안난다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class BJ_2751_수정렬하기2 {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
boolean[] temp = new boolean[2000001];
for(int n = 0; n < N; n++) {
int num = Integer.parseInt(br.readLine());
temp[num + 1000000] = true;
}
for(int n = 0; n < 2000001; n++) {
if(temp[n]) {
System.out.println(n - 1000000);
}
}
}
}
'Algorithm' 카테고리의 다른 글
에라토스테네스의 체(JAVA) (0) | 2022.04.09 |
---|---|
백준 17425번: 약수의합(JAVA) (0) | 2021.12.26 |
백준 17427번: 약수의합2(JAVA) (0) | 2021.12.26 |
백준 4375번: 1(JAVA) (0) | 2021.12.26 |
백준 9655번: 돌게임(JAVA) (0) | 2021.11.10 |
댓글