Competition/Baekjoon

[백준] 1517번 자바 버블정렬

bisi 2020. 3. 29. 10:25
문제 출처 

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

 

1517번: 버블 소트

첫째 줄에 N(1≤N≤500,000)이 주어진다. 다음 줄에는 N개의 정수로 A[1], A[2], …, A[N]이 주어진다. 각각의 A[i]는 0≤|A[i]|≤1,000,000,000의 범위에 들어있다.

www.acmicpc.net

 

 

 

접근 방식 및 풀이

- 문제에 나와 있는대로 버블 소트로 풀었다가 시간초과...

- Merge Sort의 count로 해결!

- 배열은 long 타입으로 지정!

- 참고 블로그

https://redbinalgorithm.tistory.com/m/99

 

백준 : 1517

https://www.acmicpc.net/problem/1517 1517번: 버블 소트 첫째 줄에 N(1≤N≤500,000)이 주어진다. 다음 줄에는 N개의 정수로 A[1], A[2], …, A[N]이 주어진다. 각각의 A[i]는 0≤|A[i]|≤1,000,0..

redbinalgorithm.tistory.com

 

 

 

 

소스 코드 
import java.util.Scanner;

public class Main {
    static int n;
    static long[] arr;
    static long[] arrcopy;
    static long count = 0;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        arr = new long[n];
        arrcopy = new long[n];
        for (int i = 0; i <n ; i++) {
            arr[i] =sc.nextInt();
        }

        count =0;
        Merge(0,n-1);

        System.out.println(count);
    }

    private static void Merge(int left, int right){
        if(left != right){
            int mid =(left+right)/2;
            Merge(left, mid);
            Merge(mid+1, right);
            MergeSort(left,right);
        }
    }

    private static  void MergeSort(int left , int right){
        int mid =(left+right)/2;
        int i  = left;
        int j =  mid + 1;
        int k = left;

        //이제 합친다.
        while(i <= mid && j<=right){
            // i가 mid로 오고, j가 맨끝으로 가면 반복문을 멈춘다.
            if(arr[i] > arr[j]){ // 왼쪽 있는 배열이 더 크면 더작은 오른쪽에 있는 배열을 arrcopy에 담는다.
                arrcopy[k++]=arr[j++];
                count+= mid-i+1;
            }else {
                // 반대의 경우
                arrcopy[k++] =  arr[i++];
            }
        }

        if(i>mid){ //오른쪽에 배열이 남은 경우
            while(j<=right){
                arrcopy[k++] = arr[j++];
            }
        }else{// 왼쪽에 배열이 남은 경우.
            while(i<=mid){
                arrcopy[k++] = arr[i++];
            }
        }


        //arrcopy에 담아놓은 배열을 arr배열에 다시 담는다.
        for (int h = left; h <= right ; h++) {
            arr[h] = arrcopy[h];
        }


    }


}

 

 

 

 

결과 

 

'Competition > Baekjoon' 카테고리의 다른 글

[백준] 2805번 자바 나무자르기  (0) 2020.03.29
[백준] 11724번 연결요소 구하기  (0) 2020.03.29
[백준] 9466번 텀 프로젝트  (0) 2020.03.28