티스토리 뷰
https://www.acmicpc.net/problem/10825
문제
도현이네 반 학생 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 익명 클래스만 구현해주면 된다. 코드를 보면 간단하다.
'학습 내용 > 백준 문제풀이' 카테고리의 다른 글
백준 1377 자바 - 버블 소트 (0) | 2023.03.07 |
---|---|
백준 11625 자바 - 카드 (0) | 2023.03.07 |
백준 2261 자바 - 가장 가까운 두 점 (0) | 2023.03.07 |
백준 1933 자바 - 스카이라인 (1) | 2023.03.02 |
백준 6087 자바 - 레이저 통신 (0) | 2023.02.13 |