Problem | 백준 10825번 국영수
도현이네 반 학생 N명의 이름과 국어, 영어, 수학 점수가 주어진다. 이때, 다음과 같은 조건으로 학생의 성적을 정렬하는 프로그램을 작성하시오.
- 국어 점수가 감소하는 순서로
- 국어 점수가 같으면 영어 점수가 증가하는 순서로
- 국어 점수와 영어 점수가 같으면 수학 점수가 감소하는 순서로
- 모든 점수가 같으면 이름이 사전 순으로 증가하는 순서로 (단, 아스키 코드에서 대문자는 소문자보다 작으므로 사전순으로 앞에 온다.)
- N개의의 원소 정렬의 시간 복잡도 : O(nlogn)
- Arrays.sort
static class Elem implements Comparable<Elem>{
int number;
public int compareTo(Elem other){
return /*오름차순 혹은 내림차순*/
}
}
return 음수 : 내림차순
return 양수 : 오름차순
return 0 : 동일
- 전체 코드
import java.util.*;
import java.io.*;
public class Main {
static class T implements Comparable<T> {
public int Korean, English, Math;
public String name;
public int compareTo(T other) {
//국어는 내림차순으로
if (other.Korean != Korean)
return other.Korean - Korean;
//영어는 오름 차순으로
if (other.English != English)
return English - other.English;
//수학은 내림차순으로
if (other.Math != Math)
return other.Math - Math;
return name.compareTo(other.name);
}
}
static int N;
static T[] a;
//입력받는 메소드
public static void input(){
Scanner sc=new Scanner(System.in);
N=sc.nextInt();
a=new T[N];
for (int i=0;i<N;i++){
a[i]=new T();
a[i].name=sc.next();
a[i].Korean=sc.nextInt();
a[i].English=sc.nextInt();
a[i].Math=sc.nextInt();
}
}
public static void pro(){
StringBuilder sb=new StringBuilder();
Arrays.sort(a);
for(int i=0;i<N;i++){
sb.append(a[i].name).append('\n');
}
System.out.println(sb.toString());
}
public static void main(String args[]){
input();
pro();
}
}