본문 바로가기

건승하고있어요/Java

[sort] Comparable 과 Comparator

반응형

매번 소트를 내가 일일이 짠것과는 달리 java에는 sort와 관련한 클래스가 이미 존재한다. 

배열을 정렬하고 싶은 경우 Arrays.sort, 콜렉션을 정렬하고 싶은 경우 Collections.sort를 사용하면 된다.

하지만 좀 느린거 같다... 


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

(출처: https://www.acmicpc.net/problem/2751)


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
import java.util.*;
 
public class Sort2 {
    public static void main(String[] args) {
        
        Scanner scan = new Scanner(System.in);
        
        int N = scan.nextInt();
        int array[] =  new int [N];
        
        for(int i=0 ; i<N ; i++) {
            array[i] = scan.nextInt();
        }
        
        Arrays.sort(array);
        for(int i=0 ; i<N ; i++) {
            System.out.print(array[i]);
        }
    
        
        
        scan.close();
    }
 
}
 
cs

여기서 보면 이전에 if문을 추가해서 옆 동무와 크기가 큰지 안 큰지 비교를 하는 코드 없이 
        Arrays.sort(array);
이 코드 하나로 정렬이 끝났다.
첫 포문에서는 입력받은 숫자를 배열에 넣어주고, 정렬한 뒤 두 번째 포문은 배열을 하나씩 찍어내는 것이 전부다.
(중복제거는 안했다.) 
마찬가지로 컬렉션에서도 Collections.sort() 를 사용하면 되는데, 다시 한 번 말하지만 속도는 좀 느린 것 같다.

이렇게 오름차순으로 정렬하는 경우에는 별 문제가 없는데, 다른 기준의 정렬을 원할때는 본인이 정의를 하는 수밖에 없다. 
혹은 정수가 아니라 문자, 클래스 등을 정렬해야 하는 경우는 또 애매해진다. 

그럴 때 활용할 수 있는 것이 Comparable 과 Comparator이다.

Comparable을 이용하고자 할 경우 CompareTo메소드 작성 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public int compareTo(Point that) {
        if(this.x < that.x) {
            return -1;
        } else if(this.x == that.x) {
            if(this.y < that.y) {
                return -1;
            } else if(this.y == that.y) {
                return 0;
            } else {
                return 1;
            }
        } else { 
            return 1;
        }
    }
cs

x,y 의 좌표를 정렬하는 문제였는데, 이 문제의 경우에 따르면
이 세가지를 반드시 지켜야 한다. 
-sgn(x.compareTo(y)) == -sgn(y.compareTo(x)) : x와 y의 부호가 같아야 함
-x.compareTo(y)>0 && y.compareTo(z>0) implies x.compareTo(z)>0 : 
x와 y를 비교했을 때 양수이고, y와 z를 비교했을 때 양수였다면 x와 z를 비교했을 때도 양수가 나와야 함 
-x.compareTo(y) == 0 implies that sgn(x.compareTo(z)) == sgn(y.compareTo(z)):
x와 y를 비교했을 때 0, x와 z를 비교했을대도 0, 따라서 y와 z비교했을때도 0이 나와야 함
(최백준 강의 참고)

Comparable의 정렬은 오름차순, 사전순과 같이 natural한 순서를 정의하지만, Comparator의 경우는 정렬을 하는 그 기준을 내가 정해줄 수 있는 것을 말한다. 예를들면 단어의 길이순이라든가... 아무튼 내가 정렬의 기준에 대해 정의를 내리는 것

솔직하게 말하면 지금 잘 이해가 안 가서 설명이 안 된다. 그냥 몇번 쳐보고 오류좀 나 봐야 아 ~ 이게 그거구나~ 할거 같다. 나중에 알게되면 수정하도록 하겠다!!!!! 왜케 어렵냐!!


반응형