반응형
매번 소트를 내가 일일이 짠것과는 달리 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의 경우는 정렬을 하는 그 기준을 내가 정해줄 수 있는 것을 말한다. 예를들면 단어의 길이순이라든가... 아무튼 내가 정렬의 기준에 대해 정의를 내리는 것
솔직하게 말하면 지금 잘 이해가 안 가서 설명이 안 된다. 그냥 몇번 쳐보고 오류좀 나 봐야 아 ~ 이게 그거구나~ 할거 같다. 나중에 알게되면 수정하도록 하겠다!!!!! 왜케 어렵냐!!
반응형
'건승하고있어요 > Java' 카테고리의 다른 글
[입출력] 프린터 보조 스트림printf() (0) | 2018.02.11 |
---|---|
[JDBC] MySQL JDBC 클래스 만들기 (0) | 2018.02.10 |
[Collection] Map - HashMap (0) | 2018.02.03 |
[Collection] Set - HashSet, TreeSet, LinkedHashSet (0) | 2018.02.03 |
[Collection] 스택(Stack, LIFO) 과 큐(Queue, FIFO) (0) | 2018.02.03 |