[백준] 8979번 : 올림픽

김건우·2024년 2월 23일
0

문제 풀이

목록 보기
46/62

올림픽


풀이 방법

오랜만에 풀었던 서브태스크 문제였다.
그래서 그런가 처음부터 바로 100점을 맞지 못했다..

내가 푼 방법은

  1. 입력값을 묶을 Medal class 생성
  2. Comparable class를 implements해 compareTo 메서드 override
  3. list 값들을 차례대로 탐색해가면서 순위를 체크해준다.
  4. 발견하면 sout 하고, break;

처음에 실수했던 부분은 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;
            }
        }
    }
}
profile
공부 정리용

0개의 댓글