오랜만에 풀었던 서브태스크 문제였다.
그래서 그런가 처음부터 바로 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;
}
}
}
}