이 문제는 다른 사람들의 풀이를 정말 많이 본 문제 중에 하나이다.
크게 2가지 방식으로 나뉘는 것 같다. Comparable
인터페이스를 사용한 사람과 나와 같이 Comparator
인터페이스를 사용한 사람.
전자의 경우에는 compareTo(T o) 메소드를 재정의해서 풀었을 것이고, 후자의 경우(나와 같은 경우에는) compare(T o1, T o2) 메소드를 재정의해서 풀었을 것이다.
위의 두 인터페이스는 "객체를 비교할 수 있게 한다" 는 공통점을 갖고 있다.
Comparable
Comparator
마지막으로 Java에서 정렬은 특별한 정의가 없다면 오름차순
을 기준으로 한다. 그래서 compare/compareTo 를 이용하여 객체를 비교 했을 경우 음수가 나오면 비교대상의 앞에 것이 작다는 의미로 두 대상의 위치를 바꾸지 않게 된다. 반대로 양수가 나오면 앞의 비교대상이 크다는 것이므로 정렬을 할 때는 두 대상의 위치를 바꾸게 된다.
더 자세한 내용이 알고 싶다면, 자바 [JAVA] - Comparable 과 Comparator의 이해 를 참고하면 정말 많이 도움이 된다🔥
import java.io.*;
import java.util.*;
public class Main {
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
String[][] score = new String[N][4];
/* Input */
for (int i = 0; i < N; i++) {
score[i] = br.readLine().split(" ");
}
Arrays.sort(score, new Comparator<String[]>() {
@Override
public int compare(String[] s1, String[] s2) {
if (Integer.parseInt(s1[1]) == Integer.parseInt(s2[1])) {
if (Integer.parseInt(s1[2]) == Integer.parseInt(s2[2])) {
if (Integer.parseInt(s1[3]) == Integer.parseInt(s2[3])) {
//국영수 점수가 모두 같다면 이름의 사전 오름차순
return s1[0].compareTo(s2[0]);
}
//국어 점수와 영어 점수가 같을 때, 수학 점수의 내림차순
return Integer.compare(Integer.parseInt(s2[3]), Integer.parseInt(s1[3]));
}
//국어 점수가 같을 때, 영어 점수의 오름차순
return Integer.compare(Integer.parseInt(s1[2]), Integer.parseInt(s2[2]));
}
//국어 점수의 내림차순
return Integer.compare(Integer.parseInt(s2[1]), Integer.parseInt(s1[1]));
}
});
/* Output */
for (int i = 0; i < N; i++) {
bw.write(score[i][0] + "\n");
}
br.close();
bw.flush();
bw.close();
}
}
2년만에 다시 푸는 문제라니 감회가 새롭다😂