학습 내용/백준 문제풀이
백준 10825 자바 - 국영수
ohksj77
2023. 3. 7. 15:08
https://www.acmicpc.net/problem/10825
10825번: 국영수
첫째 줄에 도현이네 반의 학생의 수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 한 줄에 하나씩 각 학생의 이름, 국어, 영어, 수학 점수가 공백으로 구분해 주어진다. 점수는 1보다 크거나 같고, 1
www.acmicpc.net
문제
도현이네 반 학생 N명의 이름과 국어, 영어, 수학 점수가 주어진다. 이때, 다음과 같은 조건으로 학생의 성적을 정렬하는 프로그램을 작성하시오.
- 국어 점수가 감소하는 순서로
- 국어 점수가 같으면 영어 점수가 증가하는 순서로
- 국어 점수와 영어 점수가 같으면 수학 점수가 감소하는 순서로
- 모든 점수가 같으면 이름이 사전 순으로 증가하는 순서로 (단, 아스키 코드에서 대문자는 소문자보다 작으므로 사전순으로 앞에 온다.)
코드
import javax.swing.*;
import java.io.*;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.StringTokenizer;
public class Main {
private static Student[] students;
public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
students = new Student[n];
StringTokenizer st;
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
students[i] = new Student(st.nextToken(), Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
}
List<Student> result = Arrays.asList(students);
result
.sort(new Comparator<>() {
@Override
public int compare(Student o1, Student o2) {
if (o1.language < o2.language) {
return 1;
} else if (o1.language == o2.language) {
if (o1.english > o2.english) {
return 1;
} else if (o1.english == o2.english) {
if (o1.math < o2.math) {
return 1;
} else if (o1.math == o2.math) {
return o1.name.compareTo(o2.name);
}
}
}
return -1;
}
});
for (Student student : result) {
bw.write(student.name + "\n");
}
bw.flush();
}
private static class Student {
String name;
int language;
int english;
int math;
public Student(String name, int language, int english, int math) {
this.name = name;
this.language = language;
this.english = english;
this.math = math;
}
}
}
풀이
정렬 조건에 맞게 Comparator 익명 클래스만 구현해주면 된다. 코드를 보면 간단하다.