SSAFY10-Class5-Algorithm / BOJ

📘SSAFY 10기 5반의 백준 문제 알고리즘 스터디
https://www.acmicpc.net/
5 stars 6 forks source link

[백준/Java] 1517번: 버블 소트 #67

Open peppermintt0504 opened 1 year ago

peppermintt0504 commented 1 year ago

문제 풀이 해당 문제는 최대 배열의 길이가 500,000이므로 버블소트를 진행한다면 O(N^2)로 시간 초과가 나온다. 시간 초과를 피하기 위해 버블 솔트와 같이 스왑을 하지만 시간 복잡도가 낮은 병합 정령(merge sort)로 문제를 풀었다.

병합 정렬을 이용하여 O(nlogn)으로 해결할 수 있다.

image

image

image

image

위 병합 정렬을 사용하면 시간 초과 없이 스왑 횟수를 출력할 수 있다.

풀이 코드

import java.io.*;
import java.util.*;
import java.util.Map.Entry;

public class Main {
    public static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    public static StringTokenizer st;
    public static int INF = Integer.MAX_VALUE;

    static long swapCount = 0;
    static long[] sorted;

    public static void main(String[] args) throws IOException {

        int N = Integer.parseInt(br.readLine());

        sorted = new long[N];
        long[] arr = new long[N];

        arr = Arrays.stream(br.readLine().split(" ")).mapToLong(Long::parseLong).toArray();

        mergeSort(arr, 0,N-1);

        System.out.println(swapCount);
    }
    static void mergeSort(long[] arr, int left, int right) {
        if(left < right) {
            int mid = (left + right) / 2;
            mergeSort(arr,left,mid);
            mergeSort(arr,mid+1,right);
            merge(arr, left,right);
        }
    }

    static void merge(long[] arr, int start, int end) {
        int mid = (start+end) / 2;
        int left = start;
        int right = mid+1;
        int index = start;

        while(left <= mid && right <= end) {
            if(arr[left] <= arr[right]) {
                sorted[index++] = arr[left++];
            }else {
                sorted[index++] = arr[right++];
                swapCount += mid + 1 - left;
            }
        }
        while(left <= mid) {
            sorted[index++] = arr[left++];
        }
        while(right <= end) {
            sorted[index++] = arr[right++];
        }
        for(int i = start; i <= end; i++) {
            arr[i] = sorted[i];
        }
    }
}