본문 바로가기

Coding/백준

1517번 버블소트

 버블 소트를 실행했을 때 swap한 횟수를 구하면 된다.

 

 버블 소트를 그대로 구하면 시간 초과가 발생한다(시간 복잡도 O(n^2)이기 때문에)

 

 머지 소트를 이용해 swap하는 횟수를 구하면 된다.

 

 ex) 5 4 3 2 1     

  -> 4 5 3 2 1     5와 4를 비교하여 1번 이동

  -> 3 4 5 2 1     3과 4,5를 비교하여 3이 2번 이동

  -> 3 4 5 1 2     1과 2를 비교하여 1번 이동

  -> 1 2 3 4 5     1과 3,4,5를 비교하여 3번 이동 + 2와 3,4,5를 비교하여 3번 이동

 총 1+2+1+3+3 = 10번 이동을 하게 된다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <iostream>
#include <vector>
 
using namespace std;
 
int N;
vector<long> A;
vector<long> sorted;
long ans;
 
void Merge(long start, long mid, long end){
    long i=start;
    long j=mid+1;
    long k=start;
    
    while(i<=mid && j<=end){
        if(A[i]>A[j]){
            ans+=(mid-i+1);
            sorted[k++]=A[j++];
        }
        else{
            sorted[k++]=A[i++];
        }
    }
    if(i>mid){
        for(long l=j;l<=end;l++){
            sorted[k++]=A[l];
        }
    }
    else{
        for(long l=i;l<=mid;l++){
            sorted[k++]=A[l];
        }
    }
    
    for(unsigned long l=start;l<=end;l++){
        A[l]=sorted[l];
    }
}
 
void MergeSort(long start, long end){
    long mid;
    
    if(start<end){
        mid=(start+end)/2;
        MergeSort(start,mid);
        MergeSort(mid+1,end);
        Merge(start,mid,end);
    }
}
 
int main(){
    cin >> N;
    
    for(int i=0;i<N;i++){
        long num;
        cin >> num;
        A.push_back(num);
    }
    
    sorted=vector<long> (A.size());
    
    MergeSort(0,A.size()-1);
    
    cout << ans << endl;
}
cs

 

'Coding > 백준' 카테고리의 다른 글

1965번 상자넣기  (0) 2020.03.16
2225번 합분해  (0) 2020.03.14
11404번 플로이드  (0) 2020.03.09
6593번 상범 빌딩  (0) 2020.03.08
1719번 택배  (0) 2020.03.01