[백준/JAVA] 2751번: 수 정렬하기 2
🔺 문제
2751번: 수 정렬하기 2
첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.
www.acmicpc.net
🔺 코드
- 풀이1) Collections.sort() 사용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
import java.util.*;
import java.io.*;
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());
List<Integer> list = new ArrayList<>();
for(int i=0 ; i<n ; i++) {
list.add(Integer.parseInt(br.readLine()));
}
Collections.sort(list);
for(int i : list) {
sb.append(i).append('\n');
}
System.out.println(sb);
}
}
|
cs |
배열 만들고 Arrays.sort()
쓰면 시간초과 에러가 난다...
그래서 리스트 만들고 Collections.sort()
써줘야 한다.
아 그리고 출력할 때 for문으로 바로 돌리면 시간 초과 에러가 뜨더라...
StringBuilder 이용해서 출력해줘야 속도가 빠르고 부하가 적기 때문이라고 함...
- 풀이2) 카운팅 정렬
수의 범위가 -1000000 ~ 1000000이며,
기준점 0을 1000000번째 인덱스로 생각하는 거라고 한다... (카운팅 정렬)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
boolean[] arr = new boolean[2000001];
int N = Integer.parseInt(br.readLine());
for(int i = 0; i < N; i++) {
arr[Integer.parseInt(br.readLine()) + 1000000] = true;
}
for(int i = 0; i < arr.length; i++) {
if(arr[i]) {
sb.append((i - 1000000)).append('\n');
}
}
System.out.print(sb);
}
}
|
cs |
이 해결법 참고한 사이트는 아래에..
- 풀이3) 병합 정렬 사용(시간 복잡도 : Onlogn)
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
import java.util.*;
import java.io.*;
public class Main {
static int[] A, tmp;
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());
A = new int[N + 1]; // 숫자 배열
tmp = new int[N + 1]; // 정렬 시 사용할 임시 배열
for(int i = 1 ; i <= N ; i++) {
A[i] = Integer.parseInt(br.readLine());
}
merge_sort(1, N);
for(int i = 1; i <= N ; i++) {
bw.write(A[i] + "\n");
}
bw.flush();
br.close();
}
public static void merge_sort(int s, int e) {
/** 1. 분할 **/
if(e - s < 1) return;
int m = s + (e - s) / 2;
// 📍 재귀 함수 형태로 구현 📍
merge_sort(s, m);
merge_sort(m + 1, e);
// tmp 배열 저장하기
for(int i = s ; i <= e ; i++) {
tmp[i] = A[i];
}
/** 2. 정복 **/
int l = s;
int r = m + 1;
int idx = s;
while(l <= m && r <= e) {
if(tmp[l] < tmp[r]) {
A[idx] = tmp[l];
idx++;
l++;
}
else {
A[idx] = tmp[r];
idx++;
r++;
}
}
// 🔔 한쪽 그룹이 모두 선택한 후 남은 값 정리하기
while(l <= m) {
A[idx] = tmp[l];
idx++;
l++;
}
while(r <= e) {
A[idx] = tmp[r];
idx++;
r++;
}
}
}
|
cs |
(+ 6/12 2회독)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
import java.util.*;
import java.io.*;
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());
long[] A = new long[N];
for(int i = 0 ; i < N ; i++) {
A[i] = Long.parseLong(br.readLine());
}
Arrays.sort(A);
for(long l : A) {
sb.append(l).append("\n");
}
System.out.println(sb);
}
}
|
cs |
아마도.. 카운팅 정렬 써야했던 거겠지...
(참고)
- 풀이
[백준] 2751번 : 수 정렬하기 2 - JAVA [자바]
www.acmicpc.net/problem/2751 2751번: 수 정렬하기 2 첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다.
st-lab.tistory.com
[백준] 2751번. 수 정렬하기 2 (Java)
백준 2751. 수 정렬하기 2 - 시간 복잡도 O(n^2)인 Arrays.sort() 사용 불가
velog.io
✔ 카운팅 정렬
자바 [JAVA] - 카운팅 정렬 (Counting Sort / 계수 정렬)
[정렬 알고리즘 모음] 더보기 1. 계수 정렬 (Counting Sort) - [현재 페이지] 2. 선택 정렬 (Selection Sort) 3. 삽입 정렬 (Insertion Sort) 4. 거품 정렬 (Bubble Sort) 5. 셸 정렬 (Shell Sort) 6. 힙 정렬 (Heap Sort) 7. 합병(
st-lab.tistory.com
알고리즘 - Counting Sort (카운팅 정렬 / 계수 정렬) 알고리즘
안녕하세요, 알고리즘을 정리하는 포스팅입니다. 다른 알고리즘을 참고하시려면 해당 카테고리를 이용해주세요. 😊 '🌻 JAVA/알고리즘, 자료구조' 카테고리의 글 목록 공부한 것들 정리한 내용
iseunghan.tistory.com