백준 8979 올림픽[Java]⭐

seren-dev·2022년 5월 22일
0

https://www.acmicpc.net/problem/8979

접근

  • compareTo 함수를 작성할 때 여러 개의 if-else문을 사용하였다.
  • Nation[] 배열을 사용하여 Arrays.sort()로 정렬하려고 했다.
  • Nation 클래스에서 멤버 변수를 private로 제한하였다.
  • 처음에는 문제를 잘못 이해하여 Nation 클래스에서 번호를 저장할 필요성을 느끼지 못했지만, 이후 num 멤버변수를 추가했다.

개선 방안

  • Array를 사용하는 것보다 ArrayList를 사용하는 것이 좋다.
  • compareTo 함수를 작성할 때 여러 개의 if-else문을 만들기보다 return o.gold - this.gold; 와 같이 작성하자.
  • private 접근 제한자를 사용하지 않아도 된다.
  • 등수를 구하는 알고리즘은 다음 링크를 참고함
    https://suhyeokeee.tistory.com/67

나의 풀이

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

public class Main {

    static class Nation implements Comparable<Nation> {
        int num, gold, silver, bronze;

        public Nation(int num, int gold, int silver, int bronze) {
            this.num = num;
            this.gold = gold;
            this.silver = silver;
            this.bronze = bronze;
        }

        @Override
        public int compareTo(Nation o) {
            if (this.gold == o.gold) {
                if (this.silver == o.silver) {
                    return o.bronze - this.bronze;
                }
                else return o.silver - this.silver;
            }
            else
                return o.gold - this.gold;
        }
    }

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

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        int t = Integer.parseInt(st.nextToken());

        ArrayList<Nation> list = new ArrayList<>();

        for (int i = 0; i < n; i++) {
            StringTokenizer tmp = new StringTokenizer(br.readLine());
            int num = Integer.parseInt(tmp.nextToken());
            int gold = Integer.parseInt(tmp.nextToken());
            int silver = Integer.parseInt(tmp.nextToken());
            int bronze = Integer.parseInt(tmp.nextToken());

            Nation nation = new Nation(num, gold, silver, bronze);
            list.add(nation);
        }

        Collections.sort(list);

        int rate = 1;
        int cnt = 1;

        if (list.get(0).num == t) {
            System.out.println(1);
            return;
        }

        for (int i = 1; i < n; i++) {

            Nation prev = list.get(i-1);
            Nation cur = list.get(i);

            if ((prev.gold != cur.gold) || (prev.silver != cur.silver) || (prev.bronze != cur.bronze)) {
                rate += cnt;
                cnt = 1;
            }
            else
                cnt++;

            if (cur.num == t) {
                System.out.println(rate);
                break;
            }
        }
    }

}

다른 사람의 풀이

0개의 댓글