Post

등수 구하기 (BOJ 1205)

등수 구하기 (BOJ 1205)

등수 구하기 (BOJ 1205)

📖 문제 설명

현재 랭킹 리스트에 점수들이 내림차순으로 주어져 있다.

새로운 점수를 넣었을 때 몇 등을 할 수 있는지 구하는 문제이다.

단, 랭킹 리스트의 최대 크기 P를 초과하면 점수를 올릴 수 없다.

✅ 조건 정리

  • N : 현재 랭킹에 있는 점수 개수

  • 내 점수

  • P : 랭킹 리스트 최대 크기

  • 점수는 내림차순으로 주어짐

  • 같은 점수는 같은 등수

  • 리스트가 가득 찼고, 마지막 점수보다 작거나 같으면 등록 불가

출력:

  • 가능한 등수 출력

  • 등록 불가 시 1

💡 풀이 방법

1️⃣ 접근 아이디어

핵심은:

🔥 “나보다 높은 점수의 개수 + 1 = 내 등수”

리스트를 앞에서부터 순회하면서:

  • 나보다 높은 점수 → 등수 증가

  • 같은 점수 → 순위 유지, 자리 차지

  • 더 낮은 점수 → 그 위치에 들어감

2️⃣ 중요한 예외 처리

✔ N == 0 인 경우

  • 랭킹이 비어있으면 1등

✔ 랭킹이 가득 찬 경우

1
현재 들어갈 수 있는 인원 수 >= P

이면 -1 출력

즉,

1
내 점수 이상인 사람 수 >= P

이면 등록 불가

3️⃣ 예시

예시 1

1
2
N=3, 내 점수=90, P=3
100 90 80
  • 100 > 90 → 등수 증가

  • 90 == 90 → 자리 차지

  • 80 < 90 → 여기서 멈춤

→ 2등 가능

예시 2 (등록 불가)

1
2
N=3, 내 점수=70, P=3
100 90 80
  • 나보다 높은 점수 3명

  • 이미 P명 가득

→ -1

💻 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
package boj;

import java.io.*;
import java.util.*;

public class Boj1205 {
    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()); // N
        int rank = Integer.parseInt(st.nextToken()); // 확인할 랭킹
        int P = Integer.parseInt(st.nextToken()); // P

        if (N == 0) { // N이 0 일때는 리스트를 받을 필요 없음
            if (P == 0) // 0인경우 아예 랭킹에 올릴 수 없음
                System.out.println("-1");
            else
                System.out.println("1");
        } else { // 리스트 받아야함
            st = new StringTokenizer(br.readLine());
            int checkCount = 0; // 지금까지 확인한 랭킹 개수
            int myRank = 1; // 나의 순위

            int[] rankList = new int[N];

            for (int i = 0; i < N; i++) {
                rankList[i] = Integer.parseInt(st.nextToken());
            }

            for (int i = 0; i < N; i++) {
                if (rankList[i] > rank) { // 나보다 크면 내가 뒷순번
                    checkCount++;
                    myRank++;
                } else if (rankList[i] == rank) {// 같으면
                    checkCount++;
                } else { // 내 자리
                    break;
                }
            }

            if (checkCount >= P) {
                System.out.println("-1");
            } else {
                System.out.println(myRank);
            }
        }

    }
}

⏱ 시간 복잡도

  • 시간복잡도: O(N)

  • 공간복잡도: O(N)

🔎 배운 점 / 느낀 점

  • 순위 문제는 “나보다 높은 점수 개수”로 접근하면 단순해진다.

  • 같은 점수 처리와 리스트 최대 크기 조건이 핵심이다.

  • 예외 케이스(N=0, 리스트 가득 참)를 먼저 정리하는 것이 중요하다.

This post is licensed under CC BY 4.0 by the author.