문제는
https://www.acmicpc.net/problem/8979
풀이는 다음과 같다.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st1 = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st1.nextToken()); //국가의 수
int K = Integer.parseInt(st1.nextToken()); //알고싶은 순위의 나라
ArrayList<nations> arr = new ArrayList<>();
for(int i = 0 ; i < N ; i++) {
StringTokenizer st2 = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st2.nextToken());
int g = Integer.parseInt(st2.nextToken());
int s = Integer.parseInt(st2.nextToken());
int b = Integer.parseInt(st2.nextToken());
arr.add(new nations(g, s, b, a, 0));
}
Collections.sort(arr);
arr.get(0).rate = 1; //정렬 후 0번째에 온 국가는 1등
int answer = 0; //기록용
//순위 매겨주기
for(int i = 1 ; i < arr.size() ; i++) {
nations now = arr.get(i);
nations before = arr.get(i-1);
if(now.index == K) {
//원하는 index까지 오면 기록
answer = i;
}
if(now.gold == before.gold && now.silver == before.silver && now.bronze == before.bronze) {
//금은동 숫자 같으면 동일순위
now.rate = before.rate;
}
else{
//아니라면 i+1 넣어주기
now.rate = i+1;
}
}
bw.write(String.valueOf(arr.get(answer).rate));
bw.flush();
bw.close();
}
static class nations implements Comparable<nations>{
int gold;
int silver;
int bronze;
int index;
int rate;
public nations(int gold, int silver, int bronze, int index, int rate) {
this.gold = gold;
this.silver = silver;
this.bronze = bronze;
this.index = index;
this.rate = rate;
}
public int compareTo(nations n) { //내가 원래 이게(this) 더 크면 1 리턴(오름차순) 으로 외웠는데, 이건 이게 작으니 내림차순임
if(n.gold == this.gold) {
if(n.silver == this.silver) {
return n.bronze - this.bronze;
}
else {
return n.silver - this.silver;
}
}
else {
return n.gold - this.gold;
}
}
}
}
사용 알고리즘은 단순구현이다.
하지만 신경써줘야 할 부분은, 어떤 클래스가 있으면,
해당 클래스를 배열화 하고 나서,
어떻게 내림차순이나 오름차순으로 정렬할 수 있을까?
바로,implements Comparable<> 을 통해 상속받고,
상속받았으므로 compareTo 라는 매서드를 구현해
정렬되는 순서를 지정해줘야 한다.
해당 내용이 아래의 comparTo 매서드이다.
이게 약간 헷갈릴 수 있기 때문에,
나는 주석 내용대로 외우다시피 했다
static class nations implements Comparable<nations>{
int gold;
int silver;
int bronze;
int index;
int rate;
public nations(int gold, int silver, int bronze, int index, int rate) {
this.gold = gold;
this.silver = silver;
this.bronze = bronze;
this.index = index;
this.rate = rate;
}
public int compareTo(nations n) { //내가 원래 이게(this) 더 크면 1 리턴(오름차순) 으로 외웠는데, 이건 이게 작으니 내림차순임
if(n.gold == this.gold) {
if(n.silver == this.silver) {
return n.bronze - this.bronze;
}
else {
return n.silver - this.silver;
}
}
else {
return n.gold - this.gold;
}
}
}
풀이에 쉽게 느끼도록 주석을 달아놓았다.