문제 설명
N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.
입력
첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.
출력
첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.
풀이
2750. 수 정렬하기 (https://gajicoding.tistory.com/263) 문제와 비슷하나,
N의 최대 개수가 1,000,000 개로, 시간을 단축하는 것이 중요한 문제이다.
2750 풀이를 그대로 사용하면, 시간초과 가 발생한다.
첫 번째 풀이 (335436 KB, 2504 ms)
- StringBuilder 를 사용하여 출력 시간을 단축시켰다.
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
StringBuilder sb = new StringBuilder();
int N = sc.nextInt();
ArrayList<Integer> list = new ArrayList<>();
for(int i = 0; i < N; i++) {
list.add(sc.nextInt());
}
Collections.sort(list);
for(int value : list) {
sb.append(value).append('\n');
}
System.out.println(sb);
}
}
두 번째 풀이 (131360 KB, 1324 ms)
- Scanner 대신 BufferedReader 를 사용하여 입력 시간을 단축시켰다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
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());
ArrayList<Integer> list = new ArrayList<>();
for(int i = 0; i < N; i++) {
list.add(Integer.parseInt(br.readLine()));
}
Collections.sort(list);
for(int value : list) {
sb.append(value).append('\n');
}
System.out.println(sb);
}
}
세 번째 풀이 (93900 KB, 672 ms)
- 카운팅 정렬/계수 정렬(Counting Sort) 사용
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());
// 중복 없이 -1,000,000 ~ 1,000,000 값 입력
boolean[] arr = new boolean[2000001];
for (int i = 0; i < N; i++) {
int num = Integer.parseInt(br.readLine()) + 1000000;
arr[num] = true;
}
for (int i = 0; i < arr.length; i++) {
if (arr[i]) {
sb.append(i - 1000000).append('\n');
}
}
System.out.println(sb);
}
}
'코딩 테스트 (Java) > 백준' 카테고리의 다른 글
[Bronze II] 2751. 수 정렬하기 (1) | 2025.05.01 |
---|