BOJ

백준 1517 - 버블 소트

yanJuicy 2020. 4. 14. 11: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

 

 

풀이

 

수열의 왼쪽에 있는 수가 오른쪽에 있는 수보다 몇 개가 더 큰지 알아내면 된다. 그 수 만큼 버블 정렬에서 swap이 일어나기 때문이다. 

수열 1 3 5 2 4 의 경우 3은 2보다 크고, 5는 2와 4보다 크므로 버블 정렬에서 swap이 총 세번 일어난다. 

 

병합 정렬을 이용해 왼쪽에 있는 수가 오른쪽에 있는 수보다 몇 개가 더 큰지 구할 수 있다. R 배열의 값을 새로운 정렬할 배열에 넣을 때 L 배열에 남아 있는 수를 더하면 된다. 

수열 1 3 5 2 4 의 경우 L = [1, 3, 5], R = [2, 4] 가 되고

R 배열에서 2를 추가할 때 L 배열에는 [3, 5] 가 남아서 2가 추가 되고

R 배열에서 4를 추가할 때 L 배열에는 [5] 만 남아서 1이 추가 되서 답은 3이 된다.

 

 

코드

 

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
#include <iostream>
 
using namespace std;
 
int N;
int A[500000];
int B[500000];
long long result;
 
void merge(int l, int mid, int r)
{
    int i = l;
    int j = mid+1;
    int idx = 0;
    while (i <= mid || j <= r)
    {
        if (i <= mid && (j > r || A[i] <= A[j]))
            B[idx++= A[i++];
        else
        {
            B[idx++= A[j++];
            result += (long long)mid - i + 1;
        }   
    }
 
    for (int i=l; i<=r; i++) A[i] = B[i-l];
}
 
void mergesort(int l, int r)
{
    if (l < r)
    {
        int mid = (l+r) / 2;
        mergesort(l, mid);
        mergesort(mid+1, r);
        merge(l, mid, r);
    }
}
 
int main()
{
    cin.tie(0);
    ios::sync_with_stdio(0);
 
    cin >> N;
    for (int i=0; i<N; i++cin >> A[i];
 
    mergesort(0, N-1);
 
    cout << result;
 
    return 0;
}
cs
반응형

'BOJ' 카테고리의 다른 글

백준 1939 - 중량 제한  (0) 2020.04.18
백준 14499 - 주사위 굴리기  (0) 2020.04.15
백준 3190 - 뱀  (0) 2020.04.13
백준 1018 - 체스판 다시 칠하기  (0) 2020.04.12
백준 13335 - 트럭  (0) 2020.04.09