본문 바로가기
Algorithm

[백준 Silver 3] 10825 국영수 - Java

by Ray 2022. 1. 7.

문제링크 : https://www.acmicpc.net/problem/10825

 

10825번: 국영수

첫째 줄에 도현이네 반의 학생의 수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 한 줄에 하나씩 각 학생의 이름, 국어, 영어, 수학 점수가 공백으로 구분해 주어진다. 점수는 1보다 크거나 같고, 1

www.acmicpc.net

 

접근 과정 : 

  • 정렬을 위한 비교 메소드를 사용할 수 있는지 묻는 문제인것 같다.
  • 국어, 영어, 수학, 이름 순으로 비교를 해야하고 점수는 숫자이지만 이름은 문자이다.
  • 한번에 비교하고자, score 클래스를 만들어서 사용했다.
  • 조건에 맞게 비교 우위를 설정하고 우선순위 큐에 집어넣어서 출력했다.

 

소스 코드 및 결과 :

package BOJ;

/* 
    국영수
*/

import java.io.*;
import java.util.*;

public class BOJ10825 {

    public static void main(String[] args) throws NumberFormatException, IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        int N = Integer.parseInt(br.readLine());
        
        PriorityQueue<score> pq = new PriorityQueue<>();

        for(int i = 0; i<N; i++){
            st = new StringTokenizer(br.readLine());
            String name = st.nextToken();
            int korean = Integer.parseInt(st.nextToken());
            int english = Integer.parseInt(st.nextToken());
            int math = Integer.parseInt(st.nextToken());

            pq.add(new score(name, korean, english, math));
            
        }

        StringBuilder sb= new StringBuilder();
        while (!pq.isEmpty()) {
            sb.append(pq.poll().name).append("\n");
        }

        System.out.println(sb.toString());


    }

    private static class score implements Comparable<score> {

        String name;
        int korean;
        int english;
        int math;

        score(String name, int korean, int english, int math) {
            this.name = name;
            this.korean = korean;
            this.english = english;
            this.math = math;
        }

        @Override
        public int compareTo(score s) {

            if (s.korean == korean) {

                if (s.english == english) {

                    if (s.math == math) {
                        return name.compareTo(s.name);
                    }

                    return s.math - math;
                }

                return english - s.english;
            }

            return s.korean - korean;
        }

    }
}

 

P.S 

평소에 알고리즘을 풀 때에는, 클래스에 비교 메소드를 오버라이드 하지 않고, 

우선순위 큐나 리스트, 배열의 sort 연산에서 람다식을 이용해서 정렬 조건을 정의한다.

쓰임새에 따라 다르겠지만, 정렬 조건이 바뀔 일이 없다면 지금처럼 클래스에 정의해주는 것이 좀 더 깔끔한 것 같기도.?