반응형

문제 출처 :


https://swexpertacademy.com/main/learn/course/subjectDetail.do?subjectId=AWWxyRM6AhMDFAW4



알고리즘 분석 :


문제 해결에 필요한 사항

1. Merge Sort


i < j 인데 A[i] > A[j] 이 말은 병합 정렬의 핵심을 의미하고 있다.


즉, 이 문제는 병합 정렬을 제대로 이해하고 있다면 해결 할 수 있는 문제이다.


병합 정렬에서 오른쪽에 있는 것과 왼쪽에 있는 것 중 arr[left] < arr[right]라는 조건에 의해 


만약 오른쪽의 것이 먼저 정렬 대상이 된다면 결국 현재 남은 왼쪽 것들이 오른쪽 것보다 크다는 의미가 되므로


swap될 것들은 mid - left + 1개가 된다.






소스 코드 : 


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
#include <iostream>
 
int arr[100002];
int tmp[100002];
long long ans;
 
void mergeSort(int start, int end) {
    if (start < end) {
 
        int mid = (start + end) >> 1;
        mergeSort(start, mid);
        mergeSort(mid + 1, end);
 
        int left = start, right = mid + 1;
        int idx = start;
 
        
        while (left <= mid || right <= end) {
            if (right > end || (left <= mid && arr[left] < arr[right])) {
 
                tmp[idx++= arr[left++];
            }
            else {
                ans += (mid - left + 1);
                tmp[idx++= arr[right++];
            }
        }
        for (int i = start; i <= end; i++)
            arr[i] = tmp[i];
    }
}
int main() {
    int tCase;
    scanf("%d"&tCase);
 
    for (int tc = 1; tc <= tCase; tc++) {
        ans = 0;
        int n;
        scanf("%d"&n);
 
        for (int i = 0; i < n; i++)
        {
            scanf("%d"&arr[i]);
        }
        mergeSort(0, n - 1);
 
        printf("#%d %lld\n", tc, ans);
    }
    return 0;
}
cs


반응형

'Applied > 알고리즘 문제풀이' 카테고리의 다른 글

[Programmers] N개의 최소공배수  (0) 2019.09.03
[1256번] K번째 접미어  (0) 2019.08.31
[17254번] 키보드 이벤트  (0) 2019.08.10
[SwExpertAcademy] 줄세우기  (0) 2019.08.07
[1251번] 하나로  (0) 2019.08.05