코테/백준

[백준/JAVA] 2751번: 수 정렬하기 2

imname1am 2023. 3. 17. 13:52
반응형

🔺 문제

 

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() 써줘야 한다.

출처 : https://www.acmicpc.net/board/view/31887

 

아 그리고 출력할 때 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

 

반응형