이름과 성적들을 2차원 배열에 저장하고 람다식으로 정렬하려고 했는데 잘안됐다.
Student라는 클래스를 정의하고, 인원수 만큼 객체를 생성한 다음 조건에 맞게 정렬해줬다.
import java.io.*;
import java.util.*;
public class ArrayEx1{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 인원수를 입력받음
int N = Integer.parseInt(br.readLine());
// N명의 정보를 저장할 Student 타입의 배열 생성
Student[] students = new Student[N];
for(int i=0;i<N;i++) {
// 입력받은 한 줄을 공백을 기준으로 나눔
String[] score = br.readLine().split(" ");
// 이름, 국어, 영어, 수학 값을 생성자에 넘겨줘서 객체를 생성함
students[i] = new Student(score[0],
Integer.parseInt(score[1]),
Integer.parseInt(score[2]),
Integer.parseInt(score[3]));
}
Comparator<Student> myComparator = new Comparator<Student>() {
@Override
// 두 Student 객체를 비교함
public int compare(Student o1, Student o2) {
if(o1.korean==o2.korean) {
if(o1.english==o2.english) {
if(o1.math==o2.math) {
// 이름 오름차순으로 정렬
return o1.name.compareTo(o2.name);
}
// 수학 점수 내림차순으로 정렬
return o2.math-o1.math;
}
// 영어 점수 오름차순으로 정렬
return o1.english - o2.english;
}
// 국어 점수 내림차순으로 정렬
return o2.korean-o1.korean;
}
};
// 위 조건을 이용해 students 배열을 정렬
Arrays.sort(students, myComparator);
// 정렬된 객체들의 이름만 출력
for(int i=0;i<N;i++) System.out.println(students[i].name);
}
}
class Student{
String name;
int korean;
int english;
int math;
Student(String name, int korean, int english, int math){
this.name = name;
this.korean = korean;
this.english = english;
this.math = math;
}
}
시간이 지나 다시 2차원 String 배열의 형태로 문제를 풀어봤다.
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));
int n = Integer.parseInt(br.readLine());
String[][] arr = new String[n][4];
for(int i=0;i<n;i++){
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
arr[i][0] = st.nextToken();
arr[i][1] = st.nextToken();
arr[i][2] = st.nextToken();
arr[i][3] = st.nextToken();
}
Arrays.sort(arr,(o1,o2)->{
// equals()는 문자열의 내용이 같은지 비교
// String==String은 두 String의 주소값이 같은지 비교하는 것임
if(o1[1].equals(o2[1])){
if(o1[2].equals(o2[2])){
if(o1[3].equals(o2[3])){
// String.compareTo()는 문자열을 비교하는 메서드
// a 같은 숫자가 아닌 문자열에는 Integer.parseInt()사용할 수 없음!!
// 문자열로 이루어진 과목명을 비교하기 위해서 사용함
return o1[0].compareTo(o2[0]);
}
// 과목의 점수는 숫자이기 때문에 int로 변환해서 비교하는 것이 가능한 것
return Integer.parseInt(o2[3])-Integer.parseInt(o1[3]);
}
return Integer.parseInt(o1[2])-Integer.parseInt(o2[2]);
}
return Integer.parseInt(o2[1])-Integer.parseInt(o1[1]);
});
for(int i=0;i<n;i++){
System.out.println(arr[i][0]);
}
}
}
'[BOJ] - JAVA' 카테고리의 다른 글
[백준] 1541 : 잃어버린 괄호 JAVA 풀이 (0) | 2022.06.17 |
---|---|
[백준] 12101 : 1, 2, 3 더하기 2 JAVA 풀이 (0) | 2022.06.11 |
[백준] 11652 : 카드 JAVA 풀이 (0) | 2022.06.11 |
[백준] 11004 : K번째 수 JAVA 풀이 (0) | 2022.06.11 |
[백준] 11057 : 오르막 수 JAVA 풀이 (0) | 2022.06.10 |