[BOJ 10825]国営水-Java

15710 ワード


key points

  • 国語の点数が同じであれば、名称の辞書は
  • に昇順する.
  • 国語と英語の点数が同じで、数学の点数の降順は
  • です.
  • 国語の点数が同じで、英語の点数の昇順は
  • です.
  • 国語点数降順
  • Solution


    この問題は多くの人が解いた問題の一つだ.
    大きく分けて2つの方法があります.Comparableインターフェースを使う人と私のようにComparatorインターフェースを使う人.
    前者はcompareTo(T o)法を再定義することによって解くことができ,後者はCompare(T o 1,T o 2)法を再定義することによって解くことができる.
    上記の2つのインタフェースには、オブジェクトを比較可能にする共通点があります.

  • Comparable
  • lang包装に属し、輸入は必要ありません.
  • 自体とパラメータオブジェクトを比較します.
  • compareToメソッドを実装する必要があります.

  • Comparator
  • utilパッケージの場合は、インポートして使用する必要があります.
  • の2つのパラメータを比較します.
  • の比較方法を実装する必要があります.
  • 最後に、Javaのソートに特別な定義がない場合は、오름차순を基準とします.したがって、compare/careToを使用してオブジェクトを比較する場合、負の値が表示されると、比較オブジェクトの前の小さいことを示すため、2つのオブジェクトの位置は変更されません.逆に、正の値が表示されると、前の比較オブジェクトが大きいため、並べ替え時に2つのオブジェクトの位置が変更されます.
    詳細については、Java[JAVA]-ComparentとCompareatorについてを参照してください.🔥

    Code

    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));
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    
            int N = Integer.parseInt(br.readLine());
            String[][] score = new String[N][4];
    
            /* Input */
            for (int i = 0; i < N; i++) {
                score[i] = br.readLine().split(" ");
            }
    
            Arrays.sort(score, new Comparator<String[]>() {
                @Override
                public int compare(String[] s1, String[] s2) {
                    if (Integer.parseInt(s1[1]) == Integer.parseInt(s2[1])) {
                        if (Integer.parseInt(s1[2]) == Integer.parseInt(s2[2])) {
                            if (Integer.parseInt(s1[3]) == Integer.parseInt(s2[3])) {
                                //국영수 점수가 모두 같다면 이름의 사전 오름차순
                                return s1[0].compareTo(s2[0]);
                            }
                            //국어 점수와 영어 점수가 같을 때, 수학 점수의 내림차순
                            return Integer.compare(Integer.parseInt(s2[3]), Integer.parseInt(s1[3]));
                        }
                        //국어 점수가 같을 때, 영어 점수의 오름차순
                        return Integer.compare(Integer.parseInt(s1[2]), Integer.parseInt(s2[2]));
                    }
                    //국어 점수의 내림차순
                    return Integer.compare(Integer.parseInt(s2[1]), Integer.parseInt(s1[1]));
                }
            });
    
            /* Output */
            for (int i = 0; i < N; i++) {
                bw.write(score[i][0] + "\n");
            }
    
            br.close();
            bw.flush();
            bw.close();
        }
    }
    

    Result



    2年ぶりに出した問題は感慨深い😂