Algorithm/Algorithm 문제

백준_1517 버블 소트 (병합정렬)

kjyyjk 2024. 1. 17. 13:32

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class BJ_1517 {

    static int[] arr, tempArr;
    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];
        tempArr = new int[n];

        StringTokenizer st = new StringTokenizer(br.readLine());

        for(int i=0; i<n; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }

        result = 0;
        mergeSort(0, n-1);

        System.out.println(new StringBuilder().append(result));
    }

    static void mergeSort(int s, int e) {
        if(e-s<1) {
            return;
        }

        int m = (s+e)/2;

        mergeSort(s, m);
        mergeSort(m+1, e);

        int i, j, k;

        for(i=s; i<e+1; i++) {
            tempArr[i] = arr[i];
        }

        i=s;
        j=m+1;
        k=s;

        while(i<m+1 && j<e+1) {
            if(tempArr[i] > tempArr[j]) {
                result += m-i+1;
                arr[k++] = tempArr[j++];
            }
            else {
                arr[k++] = tempArr[i++];
            }
        }

        while(i<m+1) {
            arr[k++] = tempArr[i++];
        }

        while(j<e+1) {
            arr[k++] = tempArr[j++];
        }
    }

}

 

merge sort의 정렬 과정에서 bubble sort의 swap 횟수를 알아낼 수 있다는 힌트를 얻고,

이해하고 풀었는데 계속 시간초과,, 분명 O(nlogn) 으로 가능한 문제인데.

 

알고보니 

tempArr에 arr의 (s,e) 범위를 복붙하는 for에서

i=s로 시작했어야 할 거를 i=0으로 잘못 입력해서 그랬던 것이다.

매번 (0,e) 범위를 tempArr에 저장하려니 시간 초과하는건 당연

 

 

 

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