HackerRank MergeSort Counting Inversions
스왑의 횟수를 찾아내는 것이다.
Input
- 횟수
- 숫자 리스트 길이
- 실제 숫자 리스트 (공백으로 구분)
Bubble Sort 솔루션
속도 문제로 Timeout
문제를 발생 시킴
def count_inversions(n,a,numSwap=0):
cumulatedNumSwap = 0
for i in range(0,n):
numSwap = 0
for j in range(0,n-1):
if a[j] > a[j+1]:
temp = a[j]
a[j] = a[j+1]
a[j+1] = temp
numSwap += 1
cumulatedNumSwap += numSwap
if numSwap == 0:
break
return cumulatedNumSwap
t = int(input().strip())
for a0 in range(t):
n = int(input().strip())
arr = list(map(int, input().strip().split(' ')))
numSwap = 0
numSwap = count_inversions(n,arr,numSwap)
print(numSwap)
출력결과
#input
2
5
1 1 1 2 2
5
2 1 3 1 2
#output
0
4
MergeSort 솔루션
- MergeSort 자체는 문제가 아니다.
- Count를 할 때
count += mid - i + 1;
이렇게 해야 한다는 점이 가장 어려운 부분이다. - 과도하게 문제가 꼬여 있다.
import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;
import java.util.regex.*;
public class Solution {
public static long countInversions(int[] arr){
return mergeSort(arr, 0, arr.length - 1);
}
public static long mergeSort(int[] arr, int start, int end){
if(start == end)
return 0;
int mid = (start + end) / 2;
long count = 0;
count += mergeSort(arr, start, mid); //left inversions
count += mergeSort(arr, mid + 1, end);//right inversions
count += merge(arr, start, end); // split inversions.
return count;
}
public static long merge(int[] arr, int start, int end){
int mid = (start + end) / 2;
int[] newArr = new int[end - start + 1];
int curr = 0;
int i = start;
int j = mid + 1;
long count = 0;
while(i <= mid && j <=end) {
if(arr[i] > arr[j]) {
newArr[curr++] = arr[j++];
count += mid - i + 1; // Tricky part.
}
else
newArr[curr++] = arr[i++];
}
// Leftover elements here.
while(i <= mid) {
newArr[curr++] = arr[i++];
}
while(j <= end) {
newArr[curr++] = arr[j++];
}
System.arraycopy(newArr, 0, arr, start, end - start + 1); // Usual stuff from merge sort algorithm with arrays.
return count;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int t = in.nextInt();
for(int a0 = 0; a0 < t; a0++){
int n = in.nextInt();
int arr[] = new int[n];
for(int arr_i=0; arr_i < n; arr_i++){
arr[arr_i] = in.nextInt();
}
System.out.println(countInversions(arr));
}
}
}
'Computer Science > Coding Interview' 카테고리의 다른 글
HackerRank Queues: A Tale of Two Stacks (0) | 2017.07.30 |
---|---|
Stacks: Balanced Brackets (0) | 2017.07.30 |
HackerRank Data Structure (0) | 2017.07.30 |
Binary Search (0) | 2017.07.28 |
HackerRank: Basic Problems (0) | 2017.07.25 |