Algorithm Solving/Java
[BOJ] 백준 2751번 : 수 정렬하기 2 - Java
기만나🐸
2024. 12. 20. 16:29
https://www.acmicpc.net/problem/2751
- PriorityQueue를 이용한 정렬
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine()); // 수의 개수
PriorityQueue<Integer> pq = new PriorityQueue<>();
// 수의 개수만큼 반복문을 돌며 정렬할 숫자 저장
for (int i=0; i<N; i++) {
pq.add(Integer.parseInt(br.readLine()));
}
// PriorityQueue : 우선순위 큐
// 우선순위가 높은 데이터가 먼저 나가는(poll()) 자료 구조
// 최소 힙을 사용하게 하여 오름차순으로 출력.
// 출력
for (int i=0; i<N; i++) {
bw.write(pq.poll()+"\n");
}
bw.close();
}
}
- 시간 초과
- ArrayList를 이용한 sort() 함수 사용
- ArrayLis의 sort()는 dual-pivot Quicksort 알고리즘
- 해당 알고리즘은 평균 시간복잡도 O(nlogn)이고, 최악의 경우 O(n^2)
- 문제 조건이 1 ≤ N ≤ 1,000,000 이기 때문에, O(n^2)인 경우 2초를 초과하게 된다.
- 시간 복잡도 참고
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine()); // 수의 개수
List<Integer> list = new ArrayList<>(); // 정렬할 수들을 저장하기 위해 리스트 선언
// 수의 개수만큼 반복문을 돌며 리스트에 숫자 저장
for (int i=0; i<N; i++) {
list.add(Integer.parseInt(br.readLine()));
}
// ArrayList 오름차순 정렬
list.sort(Comparator.naturalOrder());
// 정렬된 list 출력
for (int i=0; i<N; i++) {
System.out.println(list.get(i));
}
}
}