Algorithm

국영수 - '백준 10825번'

태인킴 2020. 9. 18. 20:32
반응형
 

10825번: 국영수

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

www.acmicpc.net

영어로 된 학생 이름, 국어 점수, 영어 점수, 수학 점수가 주어졌을때,

  1. 국어 점수가 감소하는 순서로

  2. 국어 점수가 같으면 영어 점수가 증가하는 순서로

  3. 국어 점수와 영어 점수가 같으면 수학 점수가 감소하는 순서로

  4. 모든 점수가 같으면 이름이 사전 순으로 증가하는 순서로 (단, 아스키 코드에서 대문자는 소문자보다 작으므로 사전순으로 앞에 온다.

위와 같은 조건으로 정렬 하여, 학생 이름을 출력 하면 되는 문제 입니다. 1 <= N <= 100,000 이므로, 성적표(GradeCard) 클래스를 정의하고 Collections.sort()로 한번의 정렬 O(N logN) 으로 정렬하여 출력 할수 있습니다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;

public class BOJ10825 {
    // https://www.acmicpc.net/problem/10825
    // 국영수
    // 1 <= N <= 100000
    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        List<GradeCard> gradeCards = new ArrayList<>();

        for (int i = 0; i < N; i++) {
            StringTokenizer 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());

            GradeCard gradeCard = new BOJ10825().new GradeCard(name, korean, english, math);
            gradeCards.add(gradeCard);
        }

        System.out.print(new BOJ10825().solution(N, gradeCards));
    }

    public String solution(int N, List<GradeCard> gradeCards) {
        // 1. 국어 감소
        // 2. 영어 증가
        // 3. 수학 감소
        // 4. 이름이 사전 순
        // 위 순서대로 정렬 기준을 정해서 Arrays.sort()
        // 한번 만 정렬
        // 시간 복잡도 : O(n log n)
        Collections.sort(gradeCards);
        StringBuilder sb = new StringBuilder();
        for (GradeCard gradeCard : gradeCards) {
            sb.append(gradeCard.name).append(System.lineSeparator());
        }
        return sb.toString();
    }

    class GradeCard implements Comparable<GradeCard>{
        String name;
        int korean;
        int english;
        int math;

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

        @Override
        public int compareTo(GradeCard other) {
            final int POSITIVE_NUM = 1;
            final int NEGATIVE_NUM = -1;

            if (korean < other.korean)
                return POSITIVE_NUM;
            else if (korean > other.korean)
                return NEGATIVE_NUM;

            if (english > other.english)
                return POSITIVE_NUM;
            else if (english < other.english)
                return NEGATIVE_NUM;

            if (math < other.math)
                return POSITIVE_NUM;
            else if (math > other.math)
                return NEGATIVE_NUM;

            // 영어 이름 알파베티컬 하게 비교
            return name.compareTo(other.name);
        }
    }
}
반응형