2023.03.09 : 1517 버블 소트

‍박예서·2023년 3월 9일

코딩테스트

목록 보기
20/27

1. 문제

2. 아이디어

  • 버블 소트는 한칸씩 옮겨가면서 작은 수와 큰 수를 swapping 하는 방법이다.
  • 그리고 이러한 방식은 MergeSort 에서도 유사한 방식을 사용한다.
  • MergeSort 에서 원래의 index - 바뀐 index (단, 원래의 index 가 더 클 때만)의 합이 버블 소트에서 swapping 한 횟수일 것이다.

3. 코드

import java.util.*;
import java.io.*;

class Main {
  public static long cnt;
  public static void main(String args[]) throws Exception{ 
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer st;
    
    int N = Integer.parseInt(br.readLine());
    long[] arr = new long[N];

    st = new StringTokenizer(br.readLine());
    for(int i =0 ;i < N;i++){
      arr[i] = Long.parseLong(st.nextToken());
    }
    mergeSort(arr);
    System.out.println(cnt);
  }

  public static void mergeSort(long[] arr){
    mergeSort(arr, 0, arr.length);
  }

  public static void mergeSort(long[] arr, int low, int high){
    if(high - low < 2) return;

    int mid = (low + high) /2;
    mergeSort(arr, low, mid);
    mergeSort(arr, mid, high);
    merge(arr, low, mid, high);
  }

  public static void merge(long[] arr, int low, int mid, int high){
    long[] tmp = new long[high - low];
    int l = low, h = mid, t = 0;

    while(l < mid && h < high){
      if(arr[l] <= arr[h]){
        tmp[t++] = arr[l++];
      }
      else{
        cnt += (h - (t+low));
        tmp[t++] = arr[h++];
      }
    }

    while(l < mid){
        tmp[t++] = arr[l++];
    }

    while(h < high){
        tmp[t++] = arr[h++];
    }

    for(int i = low;i<high;i++){
      arr[i] = tmp[i - low];
    }
  }
}

4. 배운 점, 느낀 점

  • 데이터의 길이가 너무 길면 Integer 보다는 long 을 쓰는 것이 맞다.

0개의 댓글