https://www.acmicpc.net/problem/8979
import java.io.*;
import java.util.*;
public class Main {
static int stoi(String s) {
return Integer.parseInt(s);
}
static int N, K;
static int answerIdx;
static List<Country> countryList = new ArrayList<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = stoi(st.nextToken());
K = stoi(st.nextToken());
for (int i = 1; i <= N; i++) {
st = new StringTokenizer(br.readLine());
Country country = new Country(stoi(st.nextToken()), stoi(st.nextToken()), stoi(st.nextToken()), stoi(st.nextToken()));
countryList.add(country);
}
Collections.sort(countryList);
countryList.get(0).rank = 1;
for (int i = 1; i < countryList.size(); i++) {
Country prevCountry = countryList.get(i - 1);
Country nowCountry = countryList.get(i);
nowCountry.rank = nowCountry.compareTo(prevCountry) == 0
? prevCountry.rank
: i + 1;
if (nowCountry.num == K) {
answerIdx = i;
}
}
System.out.println(countryList.get(answerIdx).rank);
}
static class Country implements Comparable<Country> {
int num, gold, silver, bronze, rank;
public Country(int num, int gold, int silver, int bronze) {
this.num = num;
this.gold = gold;
this.silver = silver;
this.bronze = bronze;
}
@Override
public int compareTo(Country o) {
if (this.gold == o.gold) {
if (this.silver == o.silver) {
return Integer.compare(o.bronze, this.bronze);
}
return Integer.compare(o.silver, this.silver);
}
return Integer.compare(o.gold, this.gold);
}
}
}
우선 나라 객체를 만들어주었다.
번호, 금,은,동메달 개수, 순위를 가지고 있다.
생성자는 순위 빼고 입력을 받도록 했다.
그리고 Comparable 인터페이스를 구현해서 두 나라끼리 메달 개수를 비교할 수 있도록 했다.
Integer.compare(x, y) 는 x와 y가 같으면 0을, x < y 이면 -1, x > y 면 +1을 반환한다.
public static int compare(int x, int y) {
return (x < y) ? -1 : ((x == y) ? 0 : 1);
}
나는 비교할 다른 객체의 메달을 앞쪽에 배치해서 내림차순을 구현했다.
우선 모든 나라를 리스트로 입력 받고 정렬을 해주었다.
그 다음, 같은 메달 개수를 가진 나라는 동등한 순위를 가지고, 그 뒤에 오는 나라는 앞선 나라의 수 + 1 를 해주어야 한다.
일단 인덱스 0인 나라는 무조건 순위가 1이니 rank = 1을 해주었고,
그 다음부터 반복문을 돌면서, 그 전 나라와 현재 나라와의 메달 개수를 비교해서 같다면 그 전 나라의 등수와 같게 하고, 아니라면 현재 반복문의 인덱스 + 1를 해주었다.
다른 블로그를 보니 compareTo를 구현해놓고 일일이 금은동 메달을 또 비교하고 있던데, 나는 compareTo 메서드를 통해 중복을 제거해주었다.
그리고 궁금한게, 나는 원래 answerIdx를 통해 K에 해당하는 나라의 인덱스가 아닌, Country answer 을 통해 인스턴스 자체를 저장해두었는데 이건 틀렸다고 나온다. 왜 그러지... 모르겠다.
아 알았다. 만약 idx 가 0이 K라면, Country answer은 기본값으로 null이 들어가는데, int answerIdx는 기본값이 0이니 자동으로 1등인 나라가 된다.
ㅋㅋ
'알고리즘 🤔' 카테고리의 다른 글
[백준 자바 2953] 나는 요리사다 (브론즈3) (0) | 2024.05.29 |
---|---|
[프로그래머스 자바] 모음사전 (Lv.2) (0) | 2024.05.28 |
[프로그래머스 자바] 이중우선순위큐 (Lv.3) (0) | 2024.05.25 |
[백준 자바 2669] 직사각형 네개의 합집합의 면적 구하기 (실버5) (0) | 2024.05.24 |
[프로그래머스 자바] 주식가격 (Lv.2) (0) | 2024.05.23 |