백준 8979 올림픽 JAVA 풀이 (정렬, 구현, 시간복잡도)

2026. 3. 23. 22:27·코테(Solved.ac + Programmers)
728x90

🔗 문제 링크

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


📌 문제 개요

각 나라의 금, 은, 동 메달 개수가 주어질 때
특정 국가 K의 등수를 구하는 문제이다.

 

단, 메달 수가 완전히 동일한 경우 같은 등수를 가진다.


📌 접근 방법

이 문제는 정렬 + 구현 문제로 접근했다.

  1. 나라 정보를 객체로 저장
  2. 금 → 은 → 동 기준으로 내림차순 정렬
  3. 정렬된 순서를 기준으로 등수 계산

📌 핵심 아이디어

1. 정렬 기준

  • 금메달이 많을수록 우선
  • 금이 같으면 은
  • 은도 같으면 동
Arrays.sort(arr, (a, b) -> {
    if (a.gold != b.gold) return Integer.compare(b.gold, a.gold);
    if (a.silver != b.silver) return Integer.compare(b.silver, a.silver);
    return Integer.compare(b.bronze, a.bronze);
});

2. 등수 계산 (핵심)

정렬 후, 단순히 index로 등수를 매기면 안 된다.

- 이전 나라와 메달 비교 필요

if (i > 0 &&
    arr[i].gold == arr[i-1].gold &&
    arr[i].silver == arr[i-1].silver &&
    arr[i].bronze == arr[i-1].bronze) {

    // 같은 등수 유지
} else {
    rank = i + 1;
}

3. 목표 국가 찾기

if (arr[i].num == K) {
    System.out.println(rank);
    break;
}

📌 전체 코드

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

public class Main {
    static class Country{
        int num, gold, silver, bronze;

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

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

        Country[] arr = new Country[N];

        for(int i = 0; i < N; i++){
            StringTokenizer st1 = new StringTokenizer(br.readLine());

            int num = Integer.parseInt(st1.nextToken());
            int gold = Integer.parseInt(st1.nextToken());
            int silver = Integer.parseInt(st1.nextToken());
            int bronze = Integer.parseInt(st1.nextToken());

            arr[i] = new Country(num, gold, silver, bronze);
        }

        Arrays.sort(arr, (a, b) -> {
            if (a.gold != b.gold) return Integer.compare(b.gold, a.gold);
            if (a.silver != b.silver) return Integer.compare(b.silver, a.silver);
            return Integer.compare(b.bronze, a.bronze);
        });

        int rank = 1;

        for(int i = 0; i < N; i++) {
            if (i > 0 &&
                arr[i].gold == arr[i - 1].gold &&
                arr[i].silver == arr[i - 1].silver &&
                arr[i].bronze == arr[i - 1].bronze) {
                // 같은 등수 유지
            } else {
                rank = i + 1;
            }

            if (arr[i].num == K) {
                System.out.println(rank);
                break;
            }
        }
    }
}

📌 정리

  • 정렬 기준을 정확히 세우는 것이 핵심
  • 같은 메달 수일 경우 등수를 유지하는 구현이 중요
  • 단순 index 기반 접근은 틀릴 가능성이 높다
728x90

'코테(Solved.ac + Programmers)' 카테고리의 다른 글

백준 2669 직사각형 네 개의 합집합의 면적 JAVA 풀이 (브루트포스, 구현, 시간복잡도)  (0) 2026.03.25
백준 13909 창문 닫기 JAVA 풀이 (수학, O(1))  (0) 2026.03.24
백준 9093 단어 뒤집기 JAVA 풀이 (문자열, 구현, 시간복잡도)  (0) 2026.03.22
백준 1924 2007년 JAVA 풀이 (구현, 시간복잡도)  (0) 2026.03.21
[백준] 2822번 : 점수 계산 (JAVA)  (0) 2026.03.20
'코테(Solved.ac + Programmers)' 카테고리의 다른 글
  • 백준 2669 직사각형 네 개의 합집합의 면적 JAVA 풀이 (브루트포스, 구현, 시간복잡도)
  • 백준 13909 창문 닫기 JAVA 풀이 (수학, O(1))
  • 백준 9093 단어 뒤집기 JAVA 풀이 (문자열, 구현, 시간복잡도)
  • 백준 1924 2007년 JAVA 풀이 (구현, 시간복잡도)
PUSH → MERGE → DEPLOY
PUSH → MERGE → DEPLOY
데이터 흐름과 운영 자동화를 설계하는 백엔드 개발자
  • PUSH → MERGE → DEPLOY
    Coding Dongin
    PUSH → MERGE → DEPLOY
  • 전체
    오늘
    어제
    • MEUN
      • 코테(Solved.ac + Programmers)
      • BootCamp(JAVA)
      • JAVA
      • SpringBoot
      • JavaScript
      • JSP
      • DB(SQL)
      • React
      • HTML_CSS
      • jQuery
      • SCSS
      • GSAP
      • 설치 + 꿀팁
      • 정보처리기사 오답노트
      • 정보처리기사 기출문제
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GIT
  • 공지사항

  • 인기 글

  • 태그

    문자열
    정렬
    완전탐색
    배열
    level1
    프로그래머스
    정처기
    springboot
    수학
    백엔드개발자
    브루트포스
    자바
    실기
    dp
    구현
    정처기실기
    level0
    정보처리기사
    정보처리기사 실기 기출문제
    백준
    시뮬레이션
    피보나치
    solved.ac
    기출문제
    정처기오답노트
    자료구조
    Level2
    코딩테스트
    java
    알고리즘
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.4
PUSH → MERGE → DEPLOY
백준 8979 올림픽 JAVA 풀이 (정렬, 구현, 시간복잡도)
상단으로

티스토리툴바