[백준] 1205번 : 등수구하기

김건우·2024년 3월 2일
0

문제 풀이

목록 보기
49/62

등수 구하기


풀이 방법

무서운 정답률에 비해선 매우 쉬운 문제였다.
코드의 주석을 확인하면 쉽게 이해할 수 있을 것이다.

자주 풀어본 문제라 구현에선 얼마 안걸렸지만, 97~98%에서 RunTimeError가 떠버렸다!

문제의 원인은

보다시피 예제 4번에서는 입력받는 값 n이 0이기에 2번 째 줄을 받을 필요가 없었다.

근데, 이순간 종료시켜주지 않아서 뒤에 br.readLine()에서 오류가 터져버린 것이였다~

다음엔 이런 사소한 점도 확실히 체크한 뒤, 넘어가도록하자!

코드

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 newScore = Integer.parseInt(st.nextToken());
        int p = Integer.parseInt(st.nextToken());

        // 랭킹리스트에 값이 없다면 - 뒤에 더 받는 값이 없기에 여기서 종료
        if(n==0){
            System.out.println(1);
            return;
        }

        st = new StringTokenizer(br.readLine(), " ");
        int[] scores = new int[n];
        for(int i=0;i<n;i++) {
            int score = Integer.parseInt(st.nextToken());
            scores[i] = score;
        }

        int result = solution(scores, n, newScore, p);
        System.out.println(result);

    }

    private static int solution(int[] scores, int n, int newScore, int p) {

        // 랭킹리스트가 가득차있으며, 가장 작은값보다 작거나 같다면 못넣음
        if(n==p && scores[n-1] >= newScore)
            return -1;

        // 랭킹리스트에서 자기 위치 찾기
        int rank = 1;
        int prev = -1;
        for(int i=0;i<n;i++) {
            if(scores[i] > newScore){
                // 같은 값이 여러개에 있을 경우, 맨 앞에 하나에 대해서만 rank 증가
                if(scores[i] == newScore && prev == newScore)
                    continue;
                rank++;
            }
            prev = scores[i];
        }
        return rank;
    }
}
profile
공부 정리용

0개의 댓글