CS/자료구조&알고리즘

[백준] 8979번: 올림픽

봄의 개발자 2024. 2. 4.

목차

728x90
반응형

[백준] 8979번: 올림픽 - undefined - 모든 영역
[백준] 8979번: 올림픽 - undefined - 모든 영역

 

[백준] 8979번: 올림픽 - undefined - 모든 영역

 

  • 문제 유형은 구현, 정렬
  • 문제 풀이 방법
    1. 나라, 금/은/동메달 개수, 순위 등을 저장할 클래스 (Medal)를 생성한다.
      이때 동점자를 계산하기 위해 score 변수를 Medal 클래스 내에 정의한다.
      금메달은 10점씩 은메달은 5점씩 동메달은 1점씩 부여해 총점을 계산한다.

    2. 우선 금/은/동메달을 기준으로 정렬한다. 
      1. 금메달 수가 더 많은 나라 
      2. 금메달 수가 같으면, 은메달 수가 더 많은 나라
      3. 금, 은메달 수가 모두 같으면, 동메달 수가 더 많은 나라 
    3. 순위를 계산한다.
      - 각 나라의 score를 비교해서 동일한 경우 동점 국가와 동일한 등수가 되고, 그렇지 않다면 (자신보다 더 잘한 나라 수) + 1 이 등수가 된다.

    4. 결과를 알고 싶은 국가의 등수를 출력한다.
package 구현;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class S5_8979 {
    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 nation = Integer.parseInt(st.nextToken());

        List<Medal> list = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            list.add(new Medal(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken())));
        }

        list.sort((o1, o2) -> {
            if (o1.getGold() == o2.getGold()) {
                if (o1.getSilver() == o2.getSilver()) {
                    return o2.getBronze() - o1.getBronze();
                } else {
                  return o2.getSilver() - o1.getSilver();
                }
            }
            return o2.getGold() - o1.getGold();
        });

        list.get(0).setOrder(1);
        for (int i = 1; i < n; i++) {
            for (int j = 0; j < i; j++) {
                if (list.get(i).getScore() == list.get(j).getScore()) {
                    list.get(i).setOrder(list.get(j).getOrder());
                } else {
                    list.get(i).setOrder(i+1);
                }
            }
        }

        for (Medal medal : list) {
            if (medal.getNation() == nation) {
                System.out.println(medal.getOrder());
                return;
            }
        }

    }

    public static class Medal {
        private int nation;
        private int gold;
        private int silver;
        private int bronze;
        private int score;
        private int order;

        public void setOrder(int order) {
            this.order = order;
        }

        public int getOrder() {
            return order;
        }

        public int getScore() {
            return this.score;
        }

        public Medal(int nation, int gold, int silver, int bronze) {
            this.nation = nation;
            this.gold = gold;
            this.silver = silver;
            this.bronze = bronze;
            this.score = (gold * 10) + (silver * 5) + bronze;
        }

        public int getNation() {
            return nation;
        }

        public int getGold() {
            return gold;
        }

        public int getSilver() {
            return silver;
        }

        public int getBronze() {
            return bronze;
        }
    }
}
728x90
반응형

댓글