[백준] 2751_수 정렬하기2.java

JoongHyeok.Velog·2022년 2월 11일
0

백준

목록 보기
5/8
post-thumbnail

문제

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

입력

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

출력

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


나의 풀이

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        ArrayList<Integer> list = new ArrayList<Integer>();
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < n; i++) {
            list.add(sc.nextInt());
        }

        Collections.sort(list);

        for (int i : list) {
            sb.append(i).append("\n");
        }
        System.out.println(sb);
    }
}

이 문제는 단순히 배열을 생성한다음 Arrays.sort(배열) 을 하면 시간 초과가 발생한다.
그래서 List형으로 만들어서 Collections.sort()를 사용해야하는데
두개의 차이는 다음과 같다.

Arrays.sort

1. primitive(기본형) 타입의 배열인 경우

기본형 타입의 배열인 경우는 DualPivotQuicksort를 사용합니다.

일반적인 Quicksort의 경우 1개의 Pivot으로 정렬을 수행하지만 DualPivotQuicksort는 피벗을 2개 사용해서 정렬을 수행합니다.

Quicksort는 최악의 경우 O(N²), 평균적으로 O(NlogN)의 시간 복잡도를 가집니다.

DualPivotQuicksort은 랜덤 데이터에 대해 일반적인 Quicksort보다 나은 시간 복잡도를 보장하지만, 여전히 최악의 경우 시간복잡도 O(NlogN)를 가집니다.

그러므로 만약에 정렬 알고리즘 문제 등등과 같이 시간 복잡도 O(NlogN)을 보장하는 정렬 코드를 작성해야 한다면 기본형 타입의 배열을 Arrays.sort()로 정렬하는 것은 다시 한번 생각해보셔야 할 것입니다.

2. reference(참조) 타입의 배열인 경우

참조 타입의 배열인 경우는 TimSort를 사용합니다.
24라인을 보면 ComparableTimSort클래스의 sort() 메서드를 사용하는 것을 알 수 있습니다.

22라인의 legacyMergeSort는 27라인의 주석을 보면 향후 릴리스 될 버전에서는 제거될 예정이므로 ComparableTimSort클래스의 sort()메서드를 사용한다고 생각하시면 됩니다.

TimSort는 다른 프로그래밍 언어에서도 사용하고 있는 정렬방법으로 삽입 정렬(Insertion)과 병합 정렬(Merge)을 섞어서 정렬을 수행합니다.

결국 정렬을 수행하기 위해서 사용되는 메서드는 Arrays.sort()입니다.
그러나 어떤 타입의 배열을 받느냐에 따라서 실행되는 정렬 알고리즘이 달라지는 것입니다.
표로 정리하면 다음과 같습니다.

Collections.sort

API 공식문서에서 Collections.sort()를 찾아보시면 위와 같이 2가지로 오버로딩 돼있습니다.
List객체를 파라미터로 받는 경우는 제네릭 타입인 클래스가 Comparable를 구현하고 있어야 사용 가능합니다.

Comaparator를 파라미터로 받는 경우에는 제네릭 타입 클래스가 Comparable을 구현하고 있지 않아도 사용할 수 있습니다.
이러한 경우에는 Comparator 인터페이스에 구현된 정렬 기준으로 정렬이 수행됩니다.

출처: https://codingnojam.tistory.com/38 [알면 know jam! 모르면 no jam!]

profile
영차영차

0개의 댓글