본문 바로가기
PS 문제 풀이/SWEA

[SWEA] 3998 Inversion Counting

by 까망 하르방 2021. 3. 1.
반응형

출처: [SWEA] SW 문제해결 심화 - Counting & Probability

 Input 

1

5

4 1 3 2 5

 

 Output 

#1 4

 

(4, 1), (4, 3), (4, 2), (3, 2) 이렇게 총 4개입니다.

Inversion』 상태인 i < j 인데 A[i] > A[j] 경우를 찾는 것은 병합 정렬 이용합니다.

[BOJ] 10090 Counting Inversions 

 

[BOJ] 백준 10090 Counting Inversions

출처: https://www.acmicpc.net/problem/10090  Input 7 4 2 7 1 5 6 3  Output 10 ▷ (4,2) (4,1) (4,3) (2,1) (7,1) (7,5) (7,6) (7,3) (5,3) (6,3) 총 10개 완전탐색의 경우에는 O(N2)으로 TLE 발생. 병합정..

zoosso.tistory.com


import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
  
public class Solution {
    static int[] arr, temp;
    static long answer = 0;
     
    public static void main(String args[]) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = null;
         
        int T = Integer.parseInt(br.readLine());
        for (int tc = 1; tc <= T; tc++) {
            int N = Integer.parseInt(br.readLine());
             
            arr = new int[N+1];
            temp = new int[N+1];
            st = new StringTokenizer(br.readLine());
            for(int i=1; i<=N; i++) {
                arr[i] = Integer.parseInt(st.nextToken());
            }
             
            mergeSort(1, N);
            System.out.println("#" + tc + " " + answer);
        }
    }
     
    public static void mergeSort(int left,int right) { 
        if(left >= right) return;  
        int mid = (left + right) / 2;
        mergeSort(left, mid);
        mergeSort(mid + 1, right);
        merge(left, mid, right);    
    }
     
    public static void merge(int left, int mid, int right) {
        int x = left; int y = mid + 1;    
        int k = left;    
         
        while(x <= mid || y <= right) {    
            if (y > right || (x <= mid && arr[x] < arr[y])) {
                temp[k] = arr[x++];
            }
            else {
                answer += (mid - x + 1);
                temp[k] = arr[y++];
            }
            k++;
        }
         
        for(int i = left; i <= right; i++) {
            arr[i] = temp[i];
        }
    }
}

 

반응형

'PS 문제 풀이 > SWEA' 카테고리의 다른 글

[SWEA] 3951 CRT  (0) 2021.03.01
[SWEA] 3993 Pole  (0) 2021.03.01
[SWEA] 3813 그래도 수명이 절반이 되어서는....  (0) 2021.03.01
[SWEA] 3820 롤러코스터  (0) 2021.03.01
[SWEA] 3814 평등주의  (0) 2021.03.01

댓글