
오랜만에 풀었던 서브태스크 문제였다.
그래서 그런가 처음부터 바로 100점을 맞지 못했다..
내가 푼 방법은
Medal class 생성Comparable class를 implements해 compareTo 메서드 overridebreak;처음에 실수했던 부분은 for문을 통해 검색하는데, 마지막 값을 검사못하는 로직이였는데 생각하지 못해서 시간을 좀 잡아먹었다..
이런 사소한 실수를 줄여야 푸는데 시간이 적게 걸릴텐데ㅠ
틀린 코드
int rank = 1;
int temp = 1;
for(int i=1;i<list.size();i++){
Medal first = list.get(i-1);
Medal second = list.get(i);
if(k == first.country){
System.out.println(rank);
break;
}
if(first.toString().equals(second.toString()))
temp++;
else {
if(temp == 0)
rank++;
else{
rank += temp;
temp=1;
}
}
}
첫 번째 값만 어떻게 처리할까 생각하다가 마지막을 생각못했던거같다.
이번에 사용한 꼼수?는
if(first.gold == second.gold && first.silver == second.silver && first.bronze == second.bronze)
이런식으로 모든 값이 같다는 로직을 추가해줘야 했는데,
정렬에 대한 디버깅을 해보면서 toString()을 찍은 것을 활용해 보기에는 편하게 작성한거같다.
하지만, 테스트 해본 결과 성능도 약간 떨어지고 가독성도 매우 낮았다.
이후엔 조금 귀찮더라도 가독성 높은 코드를 짜는 것을 습관을 들이자!
class Medal implements Comparable<Medal>{
int country;
int gold;
int silver;
int bronze;
public Medal(int country, int gold, int silver, int bronze) {
this.country = country;
this.gold = gold;
this.silver = silver;
this.bronze = bronze;
}
@Override
public int compareTo(Medal o) {
if(o.gold == this.gold){
if(o.silver == this.silver){
return o.bronze - this.bronze;
}
return o.silver - this.silver;
}
return o.gold - this.gold;
}
@Override
public String toString() {
return "Medal{" +
", gold=" + gold +
", silver=" + silver +
", bronze=" + bronze +
'}';
}
}
public class Main {
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());
List<Medal> list = new ArrayList<>();
for(int i=0;i<n;i++) {
st = new StringTokenizer(br.readLine()," ");
int country = Integer.parseInt(st.nextToken());
int gold = Integer.parseInt(st.nextToken());
int silver = Integer.parseInt(st.nextToken());
int bronze = Integer.parseInt(st.nextToken());
list.add(new Medal(country, gold, silver, bronze));
}
Collections.sort(list);
int rank = 1;
int temp = 1;
if(list.get(0).country == k){
System.out.println(1);
return;
}
for(int i=1;i<list.size();i++){
Medal first = list.get(i-1);
Medal second = list.get(i);
if(first.toString().equals(second.toString()))
temp++;
else {
rank += temp;
temp=1;
}
if(k == second.country){
System.out.println(rank);
break;
}
}
}
}