반응형
-내 생각
일단 문제 자체의 이해는 쉽고, 무엇을 사용해야 할지 알 수 있었다. 일반적으로 정렬 문제의 경우 특별한 경우가 아니면 Comparator클래스에서 compare 메서드를 오버 라이딩해서 풀거나 클래스로 만들어 Comparable클래스로 compareTo메서드를 오버 라이딩해서 풀어야 하는데, 한 동안 DFS, BFS, DP 문제만 풀다 보니까 리턴 값이 헷갈려서 약간 막힌 부분이 있었다.
-해법
String의 compareTo와 Integer.compare은 왼쪽에 오는 것이 더 작으면 -1(<0)을 반환하고 반대의 경우는 1(>0)을 반환한다. 같으면 0을 반환한다.
Comparator의 compare메소드의 경우 두 인자 중, 첫 번째 인자가 다음에 오는 요소(a), 두 번째 인자가 기준이 되는 요소(b)라 할 때, a와 b의 대소 관계에 따라서 -1을 반환하면 a가 왼쪽에 즉 먼저 오고, 1을 반환하면 b가 왼쪽에 즉 먼저 오게 된다. 0일 경우는 a와 b가 같을 경우이며, 이 부분에서 런타임 에러가 났었다. 리턴 값에 주의하자.
import java.util.*;
import java.math.*;
public class Main {
static String score[][];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
score = new String[n][4];
for(int i=0;i<n;i++) {
for(int j=0;j<4;j++) {
score[i][j] = sc.next();
}
}
Arrays.sort(score,new Comparator<String[]>(){
@Override
public int compare(String[] a, String[] b) {
if(Integer.valueOf(a[1])>Integer.valueOf(b[1])) { // 국어가 감소하는 순으로
// 여기선 기준의 다음 수가 더 크면 큰 수를 왼쪽으로 옮긴다.
return -1;
}
else if(Integer.valueOf(a[1])==Integer.valueOf(b[1])) { // 국어가 같다면
if(Integer.valueOf(a[2])==Integer.valueOf(b[2])) { // 영어가 같다면
if(Integer.valueOf(a[3])==Integer.valueOf(b[3])) { // 수학이 같다면
return a[0].compareTo(b[0]); // 이름순으로 정렬
// 다음에 오는 이름이 사전순으로 빠를 경우 먼저 나온다.
}
// 국어와 영어가 같다면 수학은 내림차순 정렬을 해야하므로
// 기준 수가 다음 수보다 작을경우 -1을 반환해 다음 수가 먼저 온다.
return Integer.compare(Integer.valueOf(b[3]), Integer.valueOf(a[3]));
}
// 국어가 같다면 영어를 오름차순 정렬
// 다음 수가 더 작다면 다음 수가 먼저와야 한다.
return Integer.compare(Integer.valueOf(a[2]), Integer.valueOf(b[2]));
}
else return 1; // 모든 경우에 걸리지 않으면 기존상태 유지
}
});
for(int i=0;i<n;i++) {
System.out.println(score[i][0]);
}
}
}
반응형