ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [BOJ] 등수구하기
    알고리즘 2024. 3. 26. 23:32

    문제

    태수가 즐겨하는 디제이맥스 게임은 각각의 노래마다 랭킹 리스트가 있다. 이것은 매번 게임할 때 마다 얻는 점수가 비오름차순으로 저장되어 있는 것이다.

    이 랭킹 리스트의 등수는 보통 위에서부터 몇 번째 있는 점수인지로 결정한다. 하지만, 같은 점수가 있을 때는 그러한 점수의 등수 중에 가장 작은 등수가 된다.

    예를 들어 랭킹 리스트가 100, 90, 90, 80일 때 각각의 등수는 1, 2, 2, 4등이 된다

    랭킹 리스트에 올라 갈 수 있는 점수의 개수 P가 주어진다. 그리고 리스트에 있는 점수 N개가 비오름차순으로 주어지고, 태수의 새로운 점수가 주어진다. 이때, 태수의 새로운 점수가 랭킹 리스트에서 몇 등 하는지 구하는 프로그램을 작성하시오. 만약 점수가 랭킹 리스트에 올라갈 수 없을 정도로 낮다면 -1을 출력한다.

    만약, 랭킹 리스트가 꽉 차있을 때, 새 점수가 이전 점수보다 더 좋을 때만 점수가 바뀐다.

    풀이

    우선 주어진 점수들을 내림차순으로 정렬하도록 하였다.
    이때 등수를 세어줘야 하는데 동점일 경우 같은 등수를 유지하고,
    그 이후 나오는 점수는 같은 등수 유지한 수 만큼 감소한 수를 보여야 한다.
    따라서 같은 점수를 세어주는 same변수를 두고, 등수를 세는 count변수를 두었다.

    태수의 점수가 비교 점수보다 작다면 count를 증가시키고, 같다면 same변수를 증가시킨다.
    `10 1 10
    10 9 8 7 6 5 4 3 2 1`
    의 경우에서 1과 값이 같기 때문에 10이 아닐까 생각이 들지만 P값보다 커지기 때문에
    -1이 출력이 되야 한다.

    따라서 마지막은 count + same의 값과 P의 값을 비교하여 출력시킨다.

    import java.lang.*;
    import java.util.*;
    import java.io.*;
    
    class Main {
        public static void main(String[] args) throws Exception {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String[] str = br.readLine().split(" ");
            int N = Integer.parseInt(str[0]);
            int score = Integer.parseInt(str[1]);
            int P = Integer.parseInt(str[2]);
    
            if (N == 0) {
                System.out.println(1);
                return;
            }
    
            int[] scores = Arrays.stream(br.readLine().split(" "))
                    .mapToInt(Integer::parseInt)
                    .boxed()
                    .sorted(Comparator.reverseOrder())
                    .mapToInt(Integer::intValue)
                    .toArray();
    
            int count = 1;
            int same = 0;
            for(int i = 0; i < N; i++) {
                if (score > scores[i]) {
                    break;
                } else if (score == scores[i]) {
                    same++;
                    continue;
                }
                count++;
            }
    
            if (count + same > P) {
                System.out.println("-1");
                return;
            }
    
            System.out.println(count);
        }
    }

    https://github.com/Win-9/Algorism/blob/main/BOJ/%EB%93%B1%EC%88%98%EA%B5%AC%ED%95%98%EA%B8%B0/Main.java

    728x90

    '알고리즘' 카테고리의 다른 글

    [BOJ] 전쟁-전투  (1) 2024.03.28
    [BOJ] 상자넣기  (0) 2024.03.27
    [BOJ] 킹  (0) 2024.03.26
    [BOJ] 한수  (0) 2024.03.25
    [BOJ] 체스판 다시 칠하기  (0) 2024.02.05

    댓글

Designed by Tistory.