[BOJ 10825] 국영수 - Java
key points
- 국영수 점수가 모두 같다면 이름의 사전 오름차순
- 국어 점수와 영어 점수가 같을 때, 수학 점수의 내림차순
- 국어 점수가 같을 때, 영어 점수의 오름차순
- 국어 점수의 내림차순
Solution
이 문제는 다른 사람들의 풀이를 정말 많이 본 문제 중에 하나이다.
크게 2가지 방식으로 나뉘는 것 같다. Comparable
인터페이스를 사용한 사람과 나와 같이 Comparator
인터페이스를 사용한 사람.
전자의 경우에는 compareTo(T o) 메소드를 재정의해서 풀었을 것이고, 후자의 경우(나와 같은 경우에는) compare(T o1, T o2) 메소드를 재정의해서 풀었을 것이다.
위의 두 인터페이스는 "객체를 비교할 수 있게 한다" 는 공통점을 갖고 있다.
-
Comparable
- lang 패키지에 속해 있어서 import 해 줄 필요가 없다.
- 자기 자신과 매개변수 객체를 비교한다.
- compareTo 메소드를 반드시 구현해야 한다.
-
Comparator
- util 패키지에 있어서 import 해서 사용해야 한다.
- 두 매개변수를 비교한다.
- compare 메소드를 반드시 구현해야 한다.
마지막으로 Java에서 정렬은 특별한 정의가 없다면 오름차순
을 기준으로 한다. 그래서 compare/compareTo 를 이용하여 객체를 비교 했을 경우 음수가 나오면 비교대상의 앞에 것이 작다는 의미로 두 대상의 위치를 바꾸지 않게 된다. 반대로 양수가 나오면 앞의 비교대상이 크다는 것이므로 정렬을 할 때는 두 대상의 위치를 바꾸게 된다.
더 자세한 내용이 알고 싶다면, 자바 [JAVA] - Comparable 과 Comparator의 이해 를 참고하면 정말 많이 도움이 된다🔥
Code
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();
}
}
Result
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년만에 다시 푸는 문제라니 감회가 새롭다😂
Author And Source
이 문제에 관하여([BOJ 10825] 국영수 - Java), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@nari120/BOJ-10825-국영수-Java저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)