코딩테스트/BOJ

[BOJ] 1205 등수 구하기 - JAVA

5월._. 2022. 6. 14.
728x90

1. 문제

 

1205번: 등수 구하기

첫째 줄에 N, 태수의 새로운 점수, 그리고 P가 주어진다. P는 10보다 크거나 같고, 50보다 작거나 같은 정수, N은 0보다 크거나 같고, P보다 작거나 같은 정수이다. 그리고 모든 점수는 2,000,000,000보

www.acmicpc.net

태수가 즐겨하는 디제이맥스 게임은 각각의 노래마다 랭킹 리스트가 있다. 이것은 매번 게임할 때 마다 얻는 점수가 비오름차순으로 저장되어 있는 것이다.
이 랭킹 리스트의 등수는 보통 위에서부터 몇 번째 있는 점수인지로 결정한다. 하지만, 같은 점수가 있을 때는 그러한 점수의 등수 중에 가장 작은 등수가 된다.
예를 들어 랭킹 리스트가 100, 90, 90, 80일 때 각각의 등수는 1, 2, 2, 4등이 된다.
랭킹 리스트에 올라 갈 수 있는 점수의 개수 P가 주어진다. 그리고 리스트에 있는 점수 N개가 비오름차순으로 주어지고, 태수의 새로운 점수가 주어진다. 이때, 태수의 새로운 점수가 랭킹 리스트에서 몇 등 하는지 구하는 프로그램을 작성하시오. 만약 점수가 랭킹 리스트에 올라갈 수 없을 정도로 낮다면 -1을 출력한다.
만약, 랭킹 리스트가 꽉 차있을 때, 새 점수가 이전 점수보다 더 좋을 때만 점수가 바뀐다.

첫째 줄에 N, 태수의 새로운 점수, 그리고 P가 주어진다. P는 10보다 크거나 같고, 50보다 작거나 같은 정수, N은 0보다 크거나 같고, P보다 작거나 같은 정수이다. 그리고 모든 점수는 2,000,000,000보다 작거나 같은 자연수 또는 0이다. 둘째 줄에는 현재 랭킹 리스트에 있는 점수가 비오름차순으로 주어진다. 둘째 줄은 N이 0보다 큰 경우에만 주어진다.

첫째 줄에 문제의 정답을 출력한다.


2. 풀이

1.  N이 0인 경우도 있을 수 있으므로 score는 N이 0 이상일 때만 입력받도록 한다.

2.  score를 정렬한다.

3.  가능한 랭킹리스트의 길이와 리스트에 있는 점수 개수가 같고(P==N) 가장 작은 점수가 태수보다 같거나 크다면 태수는 랭킹리스트에 들 수 없다. 바로 -1을 출력하고 종료한다.

4.  cnt에는 등수를 저장한다. score를 거꾸로 탐색하면서 태수보다 큰 점수를 만날때 cnt++하고 같거나 작다면 멈춘다. 이 때, i가 Math.max(0,P-N-1)까지만 돌도록 한다. 0은 P==N인 경우를 대비하기 위해서다.

5.  cnt를 출력한다.

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

public class BOJ_1205_등수구하기 {
   public static void main(String[] args) throws IOException {
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
      StringTokenizer st = new StringTokenizer(in.readLine());

      int N = Integer.parseInt(st.nextToken());
      int taesoo = Integer.parseInt(st.nextToken());
      int P = Integer.parseInt(st.nextToken());

      int[] score = new int[P];
      if(N>0) {
         st = new StringTokenizer(in.readLine());
         for (int i = 0; i < N; i++) score[i] = Integer.parseInt(st.nextToken());
      }

      Arrays.sort(score);

      if(P==N && score[0]>=taesoo){
         System.out.println(-1);
         return;
      }

      int cnt = 1;
      for(int i=P-1;i>=Math.max(0,P-N-1);i--){
         if(score[i]>taesoo) cnt++;
         else break;
      }
      System.out.println(cnt);
   }
}

3. 결과

'코딩테스트 > BOJ' 카테고리의 다른 글

[BOJ] 1183 약속 - JAVA  (0) 2022.06.16
[BOJ] 1198 삼각형으로 자르기 - JAVA  (0) 2022.06.15
[BOJ] 1213 팰린드롬 만들기 - JAVA  (0) 2022.06.13
[BOJ] 1235 학생번호 - JAVA  (0) 2022.06.12
[BOJ] 1182 부분 수열의 합 - JAVA  (0) 2022.06.11

댓글