[BOJ 10825] 국영수 - Java

key points

  • 국영수 점수가 모두 같다면 이름의 사전 오름차순
  • 국어 점수와 영어 점수가 같을 때, 수학 점수의 내림차순
  • 국어 점수가 같을 때, 영어 점수의 오름차순
  • 국어 점수의 내림차순

Solution

이 문제는 다른 사람들의 풀이를 정말 많이 본 문제 중에 하나이다.
크게 2가지 방식으로 나뉘는 것 같다. Comparable 인터페이스를 사용한 사람과 나와 같이 Comparator 인터페이스를 사용한 사람.

전자의 경우에는 compareTo(T o) 메소드를 재정의해서 풀었을 것이고, 후자의 경우(나와 같은 경우에는) compare(T o1, T o2) 메소드를 재정의해서 풀었을 것이다.

위의 두 인터페이스는 "객체를 비교할 수 있게 한다" 는 공통점을 갖고 있다.

  1. Comparable

    • lang 패키지에 속해 있어서 import 해 줄 필요가 없다.
    • 자기 자신과 매개변수 객체를 비교한다.
    • compareTo 메소드를 반드시 구현해야 한다.
  2. Comparator

    • util 패키지에 있어서 import 해서 사용해야 한다.
    • 두 매개변수를 비교한다.
    • compare 메소드를 반드시 구현해야 한다.

마지막으로 Java에서 정렬은 특별한 정의가 없다면 오름차순 을 기준으로 한다. 그래서 compare/compareTo 를 이용하여 객체를 비교 했을 경우 음수가 나오면 비교대상의 앞에 것이 작다는 의미로 두 대상의 위치를 바꾸지 않게 된다. 반대로 양수가 나오면 앞의 비교대상이 크다는 것이므로 정렬을 할 때는 두 대상의 위치를 바꾸게 된다.

더 자세한 내용이 알고 싶다면, 자바 [JAVA] - Comparable 과 Comparator의 이해 를 참고하면 정말 많이 도움이 된다🔥


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년만에 다시 푸는 문제라니 감회가 새롭다😂

좋은 웹페이지 즐겨찾기