2751번 수 정렬하기 2 (Java)

Date:    Updated:

카테고리:

문제 설명

N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.

제한 조건

  • 시간제한 : 2초
  • 메모리제한 : 256MB

입력 설명

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

출력 설명

첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.

예제 입력 및 출력1

5
5
4
3
2
1

1
2
3
4
5

나의 풀이

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Main {
    
    public static int[] arr, tmpArr;
    public static long result;
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        int arrLength = Integer.parseInt(br.readLine());
        arr = new int[arrLength+1];
        tmpArr = new int[arrLength+1];
        
        for(int i=1; i <= arrLength; i++){
            arr[i] = Integer.parseInt(br.readLine());
        }
        
        mergeSort(1, arrLength);
        
        for(int i=1; i <= arrLength; i++){
            bw.write(arr[i] + "\n");
        }
        
        bw.flush();
        bw.close();
    }
    
    static void mergeSort(int s, int e){
        if(e - s < 1) return;
        int m = s + (e - s) / 2;
        
        mergeSort(s, m);
        mergeSort(m+1, e);
        
        for(int i=s; i<=e; i++){
            tmpArr[i] = arr[i];
        }
        
        int k = s;
        int idx1 = s;
        int idx2 = m+1;
        
        while(idx1 <= m && idx2 <= e){
            // 두 그룹 병합
            if(tmpArr[idx1] > tmpArr[idx2]){
                arr[k] = tmpArr[idx2];
                k++;
                idx2++;
            } else {
                arr[k] = tmpArr[idx1];
                k++;
                idx1++;
            }
        }
        
        // 남아있는 값 정리
        while(idx1 <= m){
            arr[k] = tmpArr[idx1];
            k++;
            idx1++;
        }
        
        while(idx2 <= m){
            arr[k] = tmpArr[idx2];
            k++;
            idx2++;
        }
    }
}

주어지는 숫자가 최대 1,000,000 까지 되므로 Arrays 클래스의 sort 사용 시 시간초과가 발생할 수 있다. (Java 8 기준) (Arrays.sort() 는 dual pivot quick sort 방식을 사용하며 최악의 경우 O(n2))

O(nlogn) 시간복잡도를 가진 merge sort로 구현

댓글남기기