Post

🧩 Baekjoon 2751 - 수 μ •λ ¬ν•˜κΈ° 2

🧩 Baekjoon 2751 - 수 μ •λ ¬ν•˜κΈ° 2

문제

N개의 μˆ˜κ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, 이λ₯ΌΒ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 쀄에 수의 개수 N(1 ≀ N ≀ 1,000,000)이 μ£Όμ–΄μ§„λ‹€. λ‘˜μ§Έ 쀄뢀터 N개의 μ€„μ—λŠ” μˆ˜κ°€ μ£Όμ–΄μ§„λ‹€. 이 μˆ˜λŠ” μ ˆλŒ“κ°’μ΄ 1,000,000보닀 μž‘κ±°λ‚˜ 같은 μ •μˆ˜μ΄λ‹€. μˆ˜λŠ” μ€‘λ³΅λ˜μ§€ μ•ŠλŠ”λ‹€.

좜λ ₯

첫째 쀄뢀터 N개의 쀄에 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•œ κ²°κ³Όλ₯Ό ν•œ 쀄에 ν•˜λ‚˜μ”© 좜λ ₯ν•œλ‹€.

예제

βœ… μž…λ ₯ 1

1
2
3
4
5
6
5
5
4
3
2
1

βœ… 좜λ ₯ 1

1
2
3
4
5
1
2
3
4
5

μž‘μ„± μ½”λ“œ 1

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
import java.io.BufferedReader;  
import java.io.IOException;  
import java.io.InputStreamReader;  
  
public class Main {  
    public static void main(String[] args) throws IOException {  
        // 1. λ³€μˆ˜ μ„ μ–Έ 및 μ΄ˆκΈ°ν™”  
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
        StringBuilder sb = new StringBuilder();  
        int n = Integer.parseInt(br.readLine());  
        int[] arr = new int[n];  
        
        // 2. λ°°μ—΄ μ΄ˆκΈ°ν™”  
        for (int i = 0; i < n; i++) arr[i] = Integer.parseInt(br.readLine());  
        
        // 3. ν€΅μ†ŒνŠΈ  
        quickSort(arr, 0, n - 1);  
        
        // 4. 좜λ ₯  
        for (int i : arr) sb.append(i).append("\n");  
        sb.setLength(sb.length() - 1);  
        System.out.println(sb);  
    }  
    
    private static void quickSort(int[] arr, int left, int right) {  
        if (left >= right) return;  
        
        int index = partition(arr, left, right);  
        quickSort(arr, left, index - 1);  
        quickSort(arr, index, right);  
    }  
    
    private static int partition(int[] arr, int left, int right) {  
        int pivot = arr[(left + right) / 2];  
        
        while (left <= right) {  
            while (arr[left] < pivot) left++;  
            while (arr[right] > pivot) right--;  
            
            if (left <= right) {  
                swap(arr, left, right);  
                left++;  
                right--;  
            }  
        }  
        
        return left;  
    }  
    
    private static void swap(int[] arr, int i, int j) {  
        int temp = arr[i];  
        arr[i] = arr[j];  
        arr[j] = temp;  
    }  
}
  • μ΅œλŒ€ 1_000_000 개의 μˆ˜κ°€ μ£Όμ–΄μ§ˆ 수 μžˆλ‹€κ³  ν•΄μ„œ, μ²˜μŒμ—λŠ” λ¬΄λ‚œν•˜κ²Œ 효율적인 퀡 정렬을 써보자고 μƒκ°ν–ˆκ³ , μ‹œκ°„ 초과둜 μ‹€νŒ¨ν–ˆλ‹€.

μž‘μ„± μ½”λ“œ 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
25
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) throws IOException {
        // 1. λ³€μˆ˜ μ„ μ–Έ 및 μ΄ˆκΈ°ν™”
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int n = Integer.parseInt(br.readLine());
        int[] arr = new int[n];
        
        // 2. λ°°μ—΄ μ΄ˆκΈ°ν™”
        for (int i = 0; i < n; i++) arr[i] = Integer.parseInt(br.readLine());
        
        // 3. μ •λ ¬
        Arrays.sort(arr);
        
        // 4. 좜λ ₯
        for (int i : arr) sb.append(i).append("\n");
        sb.setLength(sb.length() - 1);
        System.out.println(sb);
    }
}
  • 일반 μ •λ ¬λ‘œ λ°”κΎΈλ‹ˆ 성곡은 ν–ˆλŠ”λ°, TimSort, Dual-Pivot Quicksortλ₯Ό μ‚¬μš©ν•˜λŠ” λ“± μ΅œμ ν™”κ°€ λ˜μ–΄ μžˆμ–΄μ„œ ν†΅κ³Όν•œ 것 κ°™λ‹€.
  • 사싀 κ³„μˆ˜ 정렬을 μƒκ°ν•΄μ„œ 톡과할지 λͺ°λžλŠ”λ°, 이 뢀뢄은 λ‚˜μ€‘μ— 쑰금 더 쑰사해봐야 ν•œλ‹€.

μž‘μ„± μ½”λ“œ 3

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
import java.io.BufferedReader;  
import java.io.IOException;  
import java.io.InputStreamReader;  
  
public class Main {  
    private static final int OFFSET = 1_000_000;  
    private static final int MAX_VALUE = 2_000_000;  
    public static void main(String[] args) throws IOException {  
        // 1. λ³€μˆ˜ μ„ μ–Έ 및 μ΄ˆκΈ°ν™”  
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
        StringBuilder sb = new StringBuilder();  
        int[] arr = new int[MAX_VALUE + 1];  
        int n = Integer.parseInt(br.readLine());  
        
        // 2. λ°°μ—΄ μ΄ˆκΈ°ν™”  
        for (int i = 0; i < n; i++) arr[Integer.parseInt(br.readLine()) + OFFSET] = 1;  
        
        // 3. 좜λ ₯  
        for (int i = 0; i <= MAX_VALUE; i++) {  
            if (arr[i] == 1) sb.append(i - OFFSET).append("\n");  
        }  
        
        System.out.println(sb);  
    }  
}
  • κ³„μˆ˜ μ •λ ¬λ‘œ κ΅¬ν˜„ν–ˆλ‹€.
  • ν™•μ‹€νžˆ 더 효율적이긴 ν•œλ° μŒμˆ˜λ„ λ”°λ‘œ μ²˜λ¦¬ν•΄μ€˜μ•Ό ν•˜κ³ , μ‹€μ œλ‘œ μ“Έ 수 μžˆλŠ” 사둀가 μžˆμ„μ§€ κΆκΈˆν•˜λ‹€.
  • λ‹€μŒμ€ java.util.Arraysμ—μ„œ μ œκ³΅ν•˜λŠ” sort()와 κ³„μˆ˜ μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜μ˜ μ„±λŠ₯을 λΉ„κ΅ν•œ ν‘œλ‹€.
μ•Œκ³ λ¦¬μ¦˜λ©”λͺ¨λ¦¬μ‹œκ°„
sort()1094721548
κ³„μˆ˜ μ •λ ¬99952680
This post is licensed under CC BY 4.0 by the author.