-
[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); } }
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