https://www.acmicpc.net/problem/10814
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
27
28
29
30
31
32
33
34
35
36
|
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class Main {
public static String[][] arr;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
arr = new String[n][2];
for (int i = 0; i < n; i++) {
for (int j = 0; j < 2; j++) {
arr[i][j] = sc.next();
}
}
Arrays.sort(arr, new Comparator<String[]>() {
@Override
public int compare(String[] o1, String[] o2) {
if (o1[0] == o2[0]) {//나이가 같으면 가입순으로 정렬
return Integer.parseInt(o1[1]) - Integer.parseInt(o2[1]);
} else {
return Integer.parseInt(o1[0]) - Integer.parseInt(o2[0]);
}
}
});
for (int i = 0; i < n; i++) {
System.out.println(arr[i][0] + " " + arr[i][1]);
}
}
}
|
cs |
처음에는 버블정렬에서 swap 이용하는거 생각했는데 역시나 시간초가가 났다.
그래서 2차원배열을 만들고 이걸 어떻게 하면 정렬할 수 있을지 찾아보다가
Arrays.sort(arr,Comparator) 를 이용하면 된다는 것을 발견했다..!
2차원 배열을 정렬하기 위해서는 Comparator를 Override하여 정렬하면 되는데,
o1[0]은 배열의 0번째 요소를 가리키며 그것을 기준으로 비교한다는 것이다.
나이가 같으면 가입한 순서대로 정렬이 된다.
if (o1[0] == o2[0]) {//나이가 같으면 가입순으로 정렬
return Integer.parseInt(o1[1]) - Integer.parseInt(o2[1]);
}
return Integer.compare(Integer.parseInt(o1[1]), Integer.parseInt(o2[1]));
로 리턴문을 써도 된다!
나이가 다르면 비교를 해줘야한다.
else {
return Integer.parseInt(o1[0]) - Integer.parseInt(o2[0]);
}
얘도 마찬가지로
return Integer.compare(Integer.parseInt(o1[0]), Integer.parseInt(o2[0]));
이렇게 리턴문을 써줘도 되고, 나이를 비교해서 오름차순으로 정렬해준다.
Comparator
https://st-lab.tistory.com/243
Stranger'sLAB님 티스토리 글을 참고해서 혼자 정리해봤다. 원문 글이 너무 정리가 잘 되어있어서 링크타서
보는걸 강력하게 추천한다!!
Comparator란 무엇인가?
Comparator 인터페이스를 쓰러면 compare 메서드를 구현해야한다.
Comparator 인터페이스는 객체를 비교할 수 있도록 만들어준다
예를 들어 기본자료형끼리 비교를 할 때는 부등호를 이용하여 비교할 수 있지만, 객체끼리 비교를 한다면 (배열 안의 객체) 부등호로 비교할 수 없다. 10814번 처럼 0번째 요소(0열)를 기준으로 비교할지, 1번째 요소(1열)을 기준으로 비교할기 기준이 정해져 있지 않기 때문이다. 그렇기에 Comparator를 써서 객체를 비교할 수 있다.
Comparator의 경우, 매개변수가 두개 들어가는데 이건 매개변수로 들어오는 두가지 객체를 비교하는 것을 의미한다.
return Integer.parseInt(o1[0]) - Integer.parseInt(o2[0]); 의 경우 수의 범위를 넘어가지 않을 때는 답이 맞겠지만,
오버플로우또는 언더플로우가 발생하면 잘못된 결과를 얻게 된다.
참고한 사이트
https://seeminglyjs.tistory.com/164
'알고리즘 > 정렬' 카테고리의 다른 글
[java 백준]실버 5/ 10989번 수 정렬하기 3 (0) | 2021.08.18 |
---|---|
[java 백준] 실버 5/ 11651번 좌표 정렬하기 2 (0) | 2021.08.17 |
[정렬 개념] 버블정렬/선택정렬/삽입정렬/합병정렬 (0) | 2021.08.17 |
[java 백준] 실버 4/ 10825번 국영수 (0) | 2021.08.17 |
[java 백준] 실버 5/2751번 수 정렬하기 2 (0) | 2021.08.13 |
댓글