[BOJ] ๋ฒ„๋ธ”์†ŒํŠธ ๋ฐฑ์ค€ 1517, 2751 (์ž๋ฐ” JAVA) - ๋ณ‘ํ•ฉ์ •๋ ฌ

    ๐Ÿ“Œ ๋ณ‘ํ•ฉ์ •๋ ฌ

    ๋ถ„ํ•  ์ •๋ณต ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„ํ• ํ•˜๊ณ  ๋ถ„ํ• ํ•œ ์ง‘ํ•ฉ์„ ์ •๋ ฌํ•˜๋ฉฐ ํ•ฉ์น˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

    ์‹œ๊ฐ„ ๋ณต์žก๋„ ํ‰๊ท ๊ฐ’์€ O(nlogn)

     

    ์ถœ์ฒ˜: ๊ตฌ๊ธ€

    ๐Ÿ”’ ๋ฒ„๋ธ”์†ŒํŠธ - ๋ฐฑ์ค€ 1517

    https://www.acmicpc.net/problem/1517

    ๋ฌธ์ œ

    N๊ฐœ์˜ ์ˆ˜๋กœ ์ด๋ฃจ์–ด์ง„ ์ˆ˜์—ด A[1], A[2], …, A[N]์ด ์žˆ๋‹ค. ์ด ์ˆ˜์—ด์— ๋Œ€ํ•ด์„œ ๋ฒ„๋ธ” ์†ŒํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ, Swap์ด ์ด ๋ช‡ ๋ฒˆ ๋ฐœ์ƒํ•˜๋Š”์ง€ ์•Œ์•„๋‚ด๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

    ๋ฒ„๋ธ” ์†ŒํŠธ๋Š” ์„œ๋กœ ์ธ์ ‘ํ•ด ์žˆ๋Š” ๋‘ ์ˆ˜๋ฅผ ๋ฐ”๊ฟ”๊ฐ€๋ฉฐ ์ •๋ ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ˆ˜์—ด์ด 3 2 1 ์ด์—ˆ๋‹ค๊ณ  ํ•˜์ž. ์ด ๊ฒฝ์šฐ์—๋Š” ์ธ์ ‘ํ•ด ์žˆ๋Š” 3, 2๊ฐ€ ๋ฐ”๋€Œ์–ด์•ผ ํ•˜๋ฏ€๋กœ 2 3 1 ์ด ๋œ๋‹ค. ๋‹ค์Œ์œผ๋กœ๋Š” 3, 1์ด ๋ฐ”๋€Œ์–ด์•ผ ํ•˜๋ฏ€๋กœ 2 1 3 ์ด ๋œ๋‹ค. ๋‹ค์Œ์—๋Š” 2, 1์ด ๋ฐ”๋€Œ์–ด์•ผ ํ•˜๋ฏ€๋กœ 1 2 3 ์ด ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋” ์ด์ƒ ๋ฐ”๊ฟ”์•ผ ํ•  ๊ฒฝ์šฐ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์ •๋ ฌ์ด ์™„๋ฃŒ๋œ๋‹ค.

    ์ž…๋ ฅ

    ์ฒซ์งธ ์ค„์— N(1 ≤ N ≤ 500,000)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ ์ค„์—๋Š” N๊ฐœ์˜ ์ •์ˆ˜๋กœ A[1], A[2], …, A[N]์ด ์ฃผ์–ด์ง„๋‹ค. ๊ฐ๊ฐ์˜ A[i]๋Š” 0 ≤ |A[i]| ≤ 1,000,000,000์˜ ๋ฒ”์œ„์— ๋“ค์–ด์žˆ๋‹ค.

    ์ถœ๋ ฅ

    ์ฒซ์งธ ์ค„์— Swap ํšŸ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค

    ๐Ÿ”‘ ํ•ต์‹ฌ ์•„์ด๋””์–ด

    • N์˜ ๋ฒ”์œ„๊ฐ€ 1,000,000,000 ์ด๋ฏ€๋กœ ๋ฒ„๋ธ”์†ŒํŠธ๊ฐ€ ์•„๋‹Œ O(nlogn)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„ ๋ณ‘ํ•ฉ ์ •๋ ฌ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
    • ๋‘ ๊ทธ๋ฃน์„ ๋ณ‘ํ•ฉ ํ•˜๋Š” ๊ณผ์ •์—์„œ swap์ด ์ผ์–ด๋‚˜๋Š”๋ฐ, ์˜ค๋ฅธ์ชฝ ์š”์†Œ ๊ฐ’์ด ์™ผ์ชฝ๋ณด๋‹ค ํด ๋•Œ index๊ฐ€ ์ด๋™ํ•œ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•ด์„œ result์— ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค. (๋ณ‘ํ•ฉ ์ •๋ ฌ ์ฝ”๋“œ์™€ ๊ฑฐ์˜ ๊ฐ™์Œ)
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;
    
    public class Main{
        public static int[] arr, tmp;
        public static long result;
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            int N = Integer.parseInt(br.readLine());
            arr = new int[N];
            tmp = new int[N];
            StringTokenizer st = new StringTokenizer(br.readLine());
            for(int i = 0; i < N; i++){
                arr[i] = Integer.parseInt(st.nextToken());
            }
            mergeSort(0, N-1);
    
            System.out.println(result);
        }
        
        public static void mergeSort(int start, int end){
            if(start >= end) return;
            int mid = (start + end)/2;
            mergeSort(start, mid);
            mergeSort(mid+1, end);
    
            int L = start;
            int R = mid + 1;
            int point = start;
    
            while(L <= mid || R <= end){
                if(R > end||(L <= mid && arr[L] <= arr[R])){
                    tmp[point++] = arr[L++];
                }
                else{ // L > mid || R <= end && arr[L] > arr[R]
                    if(L <= mid && arr[L] > arr[R] && R <= end){ // ์˜ค๋ฅธ์ชฝ ๊ฐ’์ด ์ž‘์€ ๊ฒฝ์šฐ
                        result += R - point; // ์ถ”์›”ํ•œ ์ธ๋ฑ์Šค๋งŒํผ result์— ์ถ”๊ฐ€
                    }
                    tmp[point++] = arr[R++];
                }
            }
            for (int i = start; i < end + 1; i++) {
                arr[i] = tmp[i];
            }
        }
    }

     

    ์•„๋ž˜ ๋ณ‘ํ•ฉ ์ •๋ ฌ ์ฝ”๋“œ์—์„œ result ๋ถ€๋ถ„๋งŒ ์ถ”๊ฐ€ํ•ด์ค€ ๊ฒƒ

    https://www.acmicpc.net/problem/2751

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class Main{
        public static int[] arr, tmp;
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            int N = Integer.parseInt(br.readLine());
            arr = new int[N];
            tmp = new int[N];
            for(int i = 0; i < N; i++){
                arr[i] = Integer.parseInt(br.readLine());
            }
            mergeSort(0, N-1);
            StringBuilder sb = new StringBuilder();
            for (int i : arr) {
                sb.append(i).append("\n");
            }
            System.out.println(sb);
        }
        
        public static void mergeSort(int start, int end){
            if(start >= end) return;
            int mid = (start + end)/2;
            mergeSort(start, mid);
            mergeSort(mid+1, end);
    
            int L = start;
            int R = mid + 1;
            int point = start;
    
            while(L <= mid || R <= end){
                // ์˜ค๋ฅธ์ชฝ์ด ์ด๋ฏธ ์ •๋ ฌ๋œ ๊ฒฝ์šฐ ์™ผ์ชฝ ์š”์†Œ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ๋’ค์— ์ €์žฅ
                // ์–‘์ชฝ์— ์š”์†Œ๊ฐ€ ๋‚จ์•„ ์žˆ์œผ๋ฉฐ ์™ผ์ชฝ์ด ์˜ค๋ฅธ์ชฝ๋ณด๋‹ค ์ž‘์„ ๋•Œ ์™ผ์ชฝ ์š”์†Œ ์ €์žฅ
                if(R > end||(L <= mid && arr[L] <= arr[R])){
                    tmp[point++] = arr[L++];
                }
                // L > mid || R<=end && arr[L] > arr[R]
                else{
                    tmp[point++] = arr[R++];
                }
            }
            for (int i = start; i < end + 1; i++) {
                arr[i] = tmp[i];
            }
        }
    }

     

     

    ์ฝ”ํ…Œ ์ •๋ฆฌ ๊นƒํ—ˆ๋ธŒ ๋งํฌ

     

    GitHub - Suyoung225/JavaPrac: Java๋กœ ๋ฐฑ์ค€, ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด

    Java๋กœ ๋ฐฑ์ค€, ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด. Contribute to Suyoung225/JavaPrac development by creating an account on GitHub.

    github.com

     

    728x90

    ๋Œ“๊ธ€