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

xyzw·2023년 3월 21일
0

algorithm

목록 보기
10/12

문제

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

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

예를 들어 랭킹 리스트가 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보다 큰 경우에만 주어진다.

출력

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


풀이

전체적인 아이디어는 랭킹 리스트의 위에서부터 차례대로 태수의 새로운 점수와 비교하는 것이다.
케이스 별 풀이 방법과 놓치기 쉬운 반례를 정리해보았다.

케이스

  1. N = 0
    랭킹 리스트에 아무것도 없으므로 태수의 새로운 점수가 1등이 된다.

    입력
    0 0 50
    출력
    1

  2. 0 < N < P
    태수의 새로운 점수보다 같거나 작은 점수가 있으면, 그 점수의 등수를 출력한다.

    입력
    3 90 10
    100 90 80
    출력
    2

    입력
    3 70 10
    100 90 80
    출력
    4

  3. 0 < N = P

  • 새로운 점수가 랭킹에 있는 모든 점수보다 같거나 작을 때
    -1을 출력한다.

    입력
    10 1 10
    10 9 8 7 6 5 4 3 2 1
    출력
    -1

    입력
    10 1 10
    1 1 1 1 1 1 1 1 1 1
    출력
    -1

  • 그렇지 않을 때
    새로운 점수가 랭킹에 있는 어떤 점수(x)와 같다면, x의 등수를 리스트에 차례대로 저장한다.
    새로운 점수가 랭킹에 있는 어떤 점수(y)보다 크다면, 리스트가 비어있는지 확인한다. 비었다면 y의 등수를 출력하고, 비지 않았다면 리스트의 0번 원소를 출력한다.

    입력
    10 1 10
    10 9 8 7 6 5 4 3 3 0
    출력
    10

    입력
    10 3 10
    10 9 8 7 6 5 4 3 3 0
    출력
    8

전체 코드

import java.util.*;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int tsScore = sc.nextInt();
		int p = sc.nextInt();

		if (n == 0)    //케이스 #1
			System.out.println(1);
		else {
			List<Integer> list = new ArrayList<Integer>();
			int i;
			for (i = 0; i < n; i++)
				list.add(sc.nextInt());

			if (p == n) {    //케이스 #3
				List<Integer> count = new ArrayList<Integer>();
				for (i = 0; i < list.size(); i++) {    //케이스 #3-2
					if (list.get(i) == tsScore) {
						count.add(i);
					}
					if (list.get(i) < tsScore) {
						if (count.size() == 0) {
							System.out.println(i + 1);
							return;
						} else {
							System.out.println(count.get(0) + 1);
							return;
						}

					}
				}

				System.out.println(-1);    //케이스 #3-1
			}

			else {    //케이스 #2
				for (i = 0; i < list.size(); i++) {
					if (list.get(i) <= tsScore) {
						System.out.println(i + 1);
						return;
					}
				}

				System.out.println(i + 1);

			}

		}

	}

}

0개의 댓글