728x90
🔗 문제 링크
https://www.acmicpc.net/problem/8979
📌 문제 개요
각 나라의 금, 은, 동 메달 개수가 주어질 때
특정 국가 K의 등수를 구하는 문제이다.
단, 메달 수가 완전히 동일한 경우 같은 등수를 가진다.
📌 접근 방법
이 문제는 정렬 + 구현 문제로 접근했다.
- 나라 정보를 객체로 저장
- 금 → 은 → 동 기준으로 내림차순 정렬
- 정렬된 순서를 기준으로 등수 계산
📌 핵심 아이디어
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 |