구현코드 :
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;
import java.util.StringTokenizer;
class Node implements Comparable<Node>{
private int gold;
private int silver;
private int bronze;
private int rank;
private int num;
public Node(int gold, int silver, int bronze, int num) {
this.gold = gold;
this.silver = silver;
this.bronze = bronze;
this.num = num;
}
@Override
public int compareTo(Node o){
if(this.getGold() == o.getGold()){
if(this.getSilver() == o.getSilver()){
return o.getBronze() - this.getBronze();
}
return o.getSilver() - this.getSilver();
}
return o.getGold() - this.getGold();
}
public int getGold() {
return gold;
}
public int getSilver() {
return silver;
}
public int getBronze() {
return bronze;
}
public int getRank() {
return rank;
}
public void setRank(int rank) {
this.rank = rank;
}
public int getNum() {
return num;
}
}
public class BOJ8979{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int cnt = Integer.parseInt(st.nextToken());
int target = Integer.parseInt(st.nextToken());
ArrayList<Node> list = new ArrayList<>();
for (int i = 0; i < cnt; i++) {
st = new StringTokenizer(br.readLine());
int num = Integer.parseInt(st.nextToken());
int gold = Integer.parseInt(st.nextToken());
int silver = Integer.parseInt(st.nextToken());
int bronze = Integer.parseInt(st.nextToken());
Node node = new Node(gold, silver, bronze, num);
list.add(node);
}
Collections.sort(list);
int rank = 1;
list.get(0).setRank(rank);
if (list.get(0).getNum() == target) {
System.out.println(1);
return;
}
for(int i = 1; i < cnt ; i++){
int gold1 = list.get(i-1).getGold();
int gold2 = list.get(i).getGold();
int silver1 = list.get(i-1).getSilver();
int silver2 = list.get(i).getSilver();
int bronze1 = list.get(i-1).getBronze();
int bronze2 = list.get(i).getBronze();
if((gold1 == gold2) && (silver1 == silver2) &&(bronze1 == bronze2)){
list.get(i).setRank(list.get(i-1).getRank());
}else{
list.get(i).setRank(i+1);
}
if(list.get(i).getNum() == target){
System.out.println(list.get(i).getRank());
break;
}
}
}
}
이 문제는 클래스 값을 정렬할 수 있는지 확인하는 문제이다. 즉 Comparable 혹은 Comparator 을 사용할 수 있는지 확인하는 문제였던거 같다.
두개 다 인터페이스 이기 때문에 Comparable 은 compareTo 메서드를, Comparator는 compare 메서드를 구현해야한다.
Comparable : 자기 자신과 비교한다는 특징이있고,
Comparator : 매개변수를 두개로 가지고 있어 자기자신이 아닌 전달받은 매개변수 두개를 비교한다는 특징이있다.
그래서 Comparator는 보통 익명 클래스를 사용한다.
Node 클래스를 보면 변수로
private int gold;
private int silver;
private int bronze;
private int rank;
private int num;
를 선언 해둔 것을 볼수있다. 실무에서는 변수에 직접접근을 잘 하지 않고 setter 도 잘 사용하지않고 생성자 방식으로 사용한다.
rank 변수는 처음 생성할 때 값이 들어가지 않기 때문에 setter 로 값을 변경 할 수 있도록 하였지만
changeRank 와 같은 이름으로 메서드를 만들어서 사용하는 편이 더 좋은 것같다.