백준 8979 올림픽 자바

꾸준하게 달리기~·2023년 6월 13일
0
post-thumbnail

문제는
https://www.acmicpc.net/problem/8979

풀이는 다음과 같다.

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));

        StringTokenizer st1 = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st1.nextToken()); //국가의 수
        int K = Integer.parseInt(st1.nextToken()); //알고싶은 순위의 나라

        ArrayList<nations> arr = new ArrayList<>();

        for(int i = 0 ; i < N ; i++) {
            StringTokenizer st2 = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st2.nextToken());
            int g = Integer.parseInt(st2.nextToken());
            int s = Integer.parseInt(st2.nextToken());
            int b = Integer.parseInt(st2.nextToken());

            arr.add(new nations(g, s, b, a, 0));
        }

        Collections.sort(arr);

        arr.get(0).rate = 1; //정렬 후 0번째에 온 국가는 1등
        
        int answer = 0; //기록용

        //순위 매겨주기
        for(int i = 1 ; i < arr.size() ; i++) {
            nations now = arr.get(i);
            nations before = arr.get(i-1);

            if(now.index == K) {
                //원하는 index까지 오면 기록
                answer = i;
            }

            if(now.gold == before.gold && now.silver == before.silver && now.bronze == before.bronze) {
                //금은동 숫자 같으면 동일순위
                now.rate = before.rate;
            }
            else{
                //아니라면 i+1 넣어주기
                now.rate = i+1;
            }




        }

        bw.write(String.valueOf(arr.get(answer).rate));
        bw.flush();
        bw.close();


    }

    static class nations implements Comparable<nations>{
        int gold;
        int silver;
        int bronze;
        int index;
        int rate;

        public nations(int gold, int silver, int bronze, int index, int rate) {
            this.gold = gold;
            this.silver = silver;
            this.bronze = bronze;
            this.index = index;
            this.rate = rate;
        }

        public int compareTo(nations n) { //내가 원래 이게(this) 더 크면 1 리턴(오름차순) 으로 외웠는데, 이건 이게 작으니 내림차순임
            if(n.gold == this.gold) {
                if(n.silver == this.silver) {
                    return n.bronze - this.bronze;
                }
                else {
                    return n.silver - this.silver;
                }
            }
            else {
                return n.gold - this.gold;
            }
        }
    }

}

사용 알고리즘은 단순구현이다.
하지만 신경써줘야 할 부분은, 어떤 클래스가 있으면,
해당 클래스를 배열화 하고 나서,
어떻게 내림차순이나 오름차순으로 정렬할 수 있을까?

바로,implements Comparable<> 을 통해 상속받고,
상속받았으므로 compareTo 라는 매서드를 구현해
정렬되는 순서를 지정해줘야 한다.
해당 내용이 아래의 comparTo 매서드이다.
이게 약간 헷갈릴 수 있기 때문에,
나는 주석 내용대로 외우다시피 했다

static class nations implements Comparable<nations>{
        int gold;
        int silver;
        int bronze;
        int index;
        int rate;

        public nations(int gold, int silver, int bronze, int index, int rate) {
            this.gold = gold;
            this.silver = silver;
            this.bronze = bronze;
            this.index = index;
            this.rate = rate;
        }

        public int compareTo(nations n) { //내가 원래 이게(this) 더 크면 1 리턴(오름차순) 으로 외웠는데, 이건 이게 작으니 내림차순임
            if(n.gold == this.gold) {
                if(n.silver == this.silver) {
                    return n.bronze - this.bronze;
                }
                else {
                    return n.silver - this.silver;
                }
            }
            else {
                return n.gold - this.gold;
            }
        }
    }

풀이에 쉽게 느끼도록 주석을 달아놓았다.

profile
반갑습니다~! 좋은하루 보내세요 :)

0개의 댓글