백준 8979 - 올림픽

문제

올림픽은 참가에 의의가 있기에 공식적으로는 국가간 순위를 정하지 않는다. 그러나, 많은 사람들이 자신의 국가가 얼마나 잘 하는지에 관심이 많기 때문에 비공식적으로는 국가간 순위를 정하고 있다. 두 나라가 각각 얻은 금, 은, 동메달 수가 주어지면, 보통 다음 규칙을 따라 어느 나라가 더 잘했는지 결정한다.

금메달 수가 더 많은 나라 금메달 수가 같으면, 은메달 수가 더 많은 나라 금, 은메달 수가 모두 같으면, 동메달 수가 더 많은 나라

각 국가는 1부터 N 사이의 정수로 표현된다. 한 국가의 등수는 (자신보다 더 잘한 나라 수) + 1로 정의된다. 만약 두 나라가 금, 은, 동메달 수가 모두 같다면 두 나라의 등수는 같다. 예를 들어, 1번 국가가 금메달 1개, 은메달 1개를 얻었고, 2번 국가와 3번 국가가 모두 은메달 1개를 얻었으며, 4번 국가는 메달을 얻지 못하였다면, 1번 국가가 1등, 2번 국가와 3번 국가가 공동 2등, 4번 국가가 4등이 된다. 이 경우 3등은 없다.

각 국가의 금, 은, 동메달 정보를 입력받아서, 어느 국가가 몇 등을 했는지 알려주는 프로그램을 작성하시오.

접근

  1. country 클래스 생성하기 - 저장용 : id, 금, 은, 동
  2. 순위를 알고 싶은 국가 찾기
금메달 수가 더 많은 나라
금메달 수가 같으면, 은메달 수가 더 많은 나라
금, 은메달 수가 모두 같으면, 동메달 수가 더 많은 나라

이 기준에 따라서 if문 작성하기.

코드

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

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

        Country[] countries = new Country[N];

        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            int id = Integer.parseInt(st.nextToken());
            int gold = Integer.parseInt(st.nextToken());
            int silver = Integer.parseInt(st.nextToken());
            int bronze = Integer.parseInt(st.nextToken());

            countries[i] = new Country(id, gold, silver, bronze);
        }

        Country K_medals = null;
        for (Country country : countries) {
            if (country.id == K_country_id) {
                K_medals = country;
                break;
            }
        }

        int rank = 1;
        for (Country country : countries) {
            if (country.id == K_country_id) {
                continue;
            }

            if (country.gold > K_medals.gold) {
                rank++;
            } else if (country.gold == K_medals.gold) {
                if (country.silver > K_medals.silver) {
                    rank++;
                } else if (country.silver == K_medals.silver) {
                    if (country.bronze > K_medals.bronze) {
                        rank++;
                    }
                }
            }
        }

        System.out.println(rank);
        br.close();
    }

    static class Country {
        int id;
        int gold;
        int silver;
        int bronze;

        public Country(int id, int gold, int silver, int bronze) {
            this.id = id;
            this.gold = gold;
            this.silver = silver;
            this.bronze = bronze;
        }
    }
}

결론

  1. br.close 위치 조심하기 - 괄호의 지옥 속에서 실수로 for문 안에서 해버렸더니 12점이 나와서 놀랐다.

  2. 문제 자세히 읽어보기

모든 국가의 순위를 보여주는게 아니라, 순위를 알고싶은 나라만 기준으로 생각하면 되는 문제임. 그리 복잡하지 않음