주어진 수만큼 학생 이름과 3과목의 점수를 적고 정렬 방법에 따라 정렬해주는 문제입니다.
첫 번째 조건 국어 점수가 감소하는 순서니 내림차순
두 번쨰 조건 국어 점수가 같다면 영어 점수가 증가하는 순서니 오름차순
세 번째 조건 국어 영어 점수가 같으면 수학 점수 감소하는 순서니 내림차순
마지막 조건 모든 과목 점수가 같으면 학생 이름을 사전순으로
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;
public class p10825 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st;
Student [] ar;
int N = Integer.parseInt(br.readLine());
ar = new Student[N];
for (int i=0; i<N; i++) {
st = new StringTokenizer(br.readLine(), " ");
ar[i] = new Student( st.nextToken(), Integer.parseInt(st.nextToken()),
Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()) );
}
Arrays.sort(ar, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
//국어 영어 수학 3과목의 점수가 모두 같으면 이름을 사전순으로
if( o1.korea == o2.korea && o1.english == o2.english && o1.math == o2.math ) {
return (o1.name).compareTo(o2.name);
//국어 영어 점수가 같으면 수학 점수를 내림차순으로
} else if( o1.korea == o2.korea && o1.english == o2.english ) {
return o2.math - o1.math;
//국어 점수가 같으면 영어 점수를 오름차순으로
} else if ( o1.korea == o2.korea ) {
return o1.english - o2.english;
//국어 점수 내림차순
} else {
return o2.korea - o1.korea;
}
}
});
for(int i=0; i<ar.length; i++) {
sb.append(ar[i].name + "\n");
}
System.out.println(sb);
}
static class Student {
String name;
int korea;
int english;
int math;
public Student(String name, int korea, int english, int math) {
this.name = name;
this.korea = korea;
this.english = english;
this.math = math;
}
}
}
Comparator 인터페이스를 이용해 정렬을 구현했습니다.
Comparator 인터페이스의 compare 메서드는 오버라이딩해서 개발자가 직접 정렬 방법을 만드는 메서드이며,
파라미터 2개를 받아 작성한 연산의 반환값에 따라 정렬을 합니다.
자바에서는 기본적으로 정렬을 오름차순으로 하는데요.
compare 메서드 반환값이 양수가 나오면 첫 번째 파라미터가 더 크다고 생각하고 두 값의 위치를 바꾸고
음수가 나오면 첫 번쨰 파라미터가 더 작다고 생각해 위치를 바꾸지 않습니다.
그래서 오름차순으로 정렬을 한다면 첫 번째 파라미터 - 두 번쨰 파라미터 연산의 결과를 반환값으로 주게 됩니다.
만약 내림차순으로 정렬하고 싶다면 두 번째 파라미터 - 첫 번째 파라미터 연산의 결과를 반환값으로 주면 됩니다.
사전순 정렬은 Comparable 의 compareTo() 메서드를 사용했습니다.
'Baekjoon' 카테고리의 다른 글
[백준] 3036번 - 링 - Java (0) | 2022.10.05 |
---|---|
[백준] 1302번 - 베스트셀러 - Java (0) | 2022.09.19 |
[백준] 2693번 - N번째 큰 수 - Java (0) | 2022.09.18 |
[백준] 10867번 - 중복 빼고 정렬하기 - Java (0) | 2022.09.08 |
[백준] 12605번 - 단어순서 뒤집기 - Java (0) | 2022.08.12 |
댓글