문제
https://www.acmicpc.net/problem/8979
풀이
각 나라마다 금, 은, 동메달의 수가 있으면 등수를 구하는 문제이다. 단, 동점자일 경우에 유의한다.
필자는 금, 은, 동메달의 수가 같은 경우(동일 등수)에 대해서 HashMap을 사용해 나라의 번호의 ArrayList 형태로 저장하려고 했다.
금, 은, 동 메달에 대한 정보를 저장하는 클래스에 대해 hashCode, equals 메서드를 오버라이딩해 재 구현을 해야했고, 메달 정보를 저장하는 클래스를 정렬을 해야했고, 구현해야하는 점이 많았다.
잘 생각해보면 정렬을 해버리면 금, 은, 동 메달의 수가 서로 붙어 있게 된다. 이전의 메달의 수와 현재의 메달의 수를 비교해서 등수를 매길 수 있지 않을까?
그리고 등수는 자신보다 등수가 높은 사람의 수 + 1이므로, 순회하는 인덱스로 등수를 계산할 수 있었다.
1. 메달에 대한 정보를 저장하는 클래스를 생성한다.(번호, 금메달, 은메달, 동메달)
2. 등수를 저장할 배열을 선언하고, ArrayList에 메달에 대한 정보를 모두 저장한다.
3. 금, 은, 동 순으로 내림차순 정렬을 해서 저장한다.
4. 국가의 수가 1개 이상이 문제 조건이므로, 첫번째 국가에 등수를 넣어준다.
5. 바로 이전 나라와 메달의 조건이 동일하면 이전 나라의 메달 조건을 넣어주고, 그렇지 않으면 i + 1로 등수를 넣어준다.
6. k번 국가의 등수를 출력한다.
소스코드
import java.util.ArrayList;
import java.util.StringTokenizer;
import java.util.Collections;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
static class Country {
int num;
int gold;
int silver;
int bronze;
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());
int[] rateArr = new int[n + 1];
ArrayList<Country> list = new ArrayList<>();
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine(), " ");
int num = Integer.parseInt(st.nextToken());
int g = Integer.parseInt(st.nextToken());
int s = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
list.add(new Country(num, g, s, b));
}
Collections.sort(list, (c1, c2) -> {
if (c1.gold != c2.gold) return c2.gold - c1.gold;
if (c1.silver != c2.silver) return c2.silver - c1.silver;
return c2.bronze - c1.bronze;
});
rateArr[list.get(0).num] = 1;
for (int i = 1; i < list.size(); i++) {
int beforeGold = list.get(i - 1).gold;
int beforeSilver = list.get(i - 1).silver;
int beforeBronze = list.get(i - 1).bronze;
int beforeNumber = list.get(i - 1).num;
if (beforeGold == list.get(i).gold && beforeSilver == list.get(i).silver && beforeBronze == list.get(i).bronze) {
rateArr[list.get(i).num] = rateArr[beforeNumber];
} else {
rateArr[list.get(i).num] = i + 1;
}
}
System.out.print(rateArr[k]);
br.close();
}
}
실행결과

'Problem Solving > Baekjoon' 카테고리의 다른 글
| [Baekjoon] 감소하는 수 - Java (0) | 2025.08.23 |
|---|---|
| [Baekjoon] 과일 탕후루 - Java (0) | 2025.08.21 |
| [Baekjoon] 백준 12865: 평범한 배낭 - Java (0) | 2025.06.22 |
| [Baekjoon] 백준 1092: 배 - Java (0) | 2024.10.17 |
| [Baekjoon] 백준 7662: 이중 우선순위 큐 - Java (0) | 2024.09.22 |