백준 올림픽

KIMYEONGJUN·2026년 2월 23일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

입력의 첫 줄은 국가의 수 N(1 ≤ N ≤ 1,000)과 등수를 알고 싶은 국가 K(1 ≤ K ≤ N)가 빈칸을 사이에 두고 주어진다.
각 국가는 1부터 N 사이의 정수로 표현된다.
이후 N개의 각 줄에는 차례대로 각 국가를 나타내는 정수와 이 국가가 얻은 금, 은, 동메달의 수가 빈칸을 사이에 두고 주어진다.
전체 메달 수의 총합은 1,000,000 이하이다.

출력은 단 한 줄이며, 입력받은 국가 K의 등수를 하나의 정수로 출력한다.
등수는 반드시 문제에서 정의된 방식을 따라야 한다.

내가 이 문제를 보고 생각해본 부분

먼저 BufferedReader와 StringTokenizer를 사용해 입력을 빠르게 받는다.
배열 countries는 각 국가의 번호와 금, 은, 동메달 수를 저장한다.
입력받은 국가 중 등수를 알고 싶은 K 국가의 메달 정보를 따로 저장한다.
모든 국가를 순회하면서 K 국가보다 등수가 더 높은 국가가 있는지 비교해준다.
비교는 금 > 은 > 동 순서로 한다. 
더 많은 메달을 가진 국가는 rank가 1씩 올라간다.
이렇게 rank가 최종적으로 계산되면 K 국가의 등수인 rank를 출력한다.
마지막에 리소스 누수를 막기 위해 br.close()로 스트림을 닫는다.

코드로 구현

package baekjoon.baekjoon_33;

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

// 백준 8979번 문제
public class Main1307 {
    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 = Integer.parseInt(st.nextToken());

        int[][] countries = new int[N][4]; // [국가 번호, 금, 은, 동]
        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            countries[i][0] = Integer.parseInt(st.nextToken());
            countries[i][1] = Integer.parseInt(st.nextToken());
            countries[i][2] = Integer.parseInt(st.nextToken());
            countries[i][3] = Integer.parseInt(st.nextToken());
        }

        int kGold = 0, kSilver = 0, kBronze = 0;
        for (int i = 0; i < N; i++) {
            if (countries[i][0] == K) {
                kGold = countries[i][1];
                kSilver = countries[i][2];
                kBronze = countries[i][3];
                break;
            }
        }

        int rank = 1;
        for (int i = 0; i < N; i++) {
            if (countries[i][1] > kGold) {
                rank++;
            } else if (countries[i][1] == kGold) {
                if (countries[i][2] > kSilver) {
                    rank++;
                } else if (countries[i][2] == kSilver) {
                    if (countries[i][3] > kBronze) {
                        rank++;
                    }
                }
            }
        }

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

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글